資料連線池——JNDI
資料庫連線有很多中方式,JDBC資料庫的連線方式,前邊我們已經介紹過了,而開發中我們經常使用的是DataBaseConnectionPool(資料庫連線池,DBCP)。資料庫連線池到底是什麼?它比jdbc資料庫連線有什麼優勢呢?它又怎麼使用呢?
一,先看一下JDBC連線,每次使用者訪問資料庫時,需要JDBC為我們建立資料庫連線,我們使用,然後關閉。而當我們加斷點測試,可以發現這個過程中建立資料庫連線這個過程是比較費時間的,而不是我們在資料庫中操作資料費時間。所以JDBC這種方式的效率大大折扣。而且如果過多的人同時併發來訪問資料庫,連線數量建立過多,會導致效能降低,更嚴重可能會導致資料庫崩潰。而,資料庫連線池就是來解決這兩種問題的。
二,資料庫連線池是什麼?
顧名思義就是盛放多個數據庫連線的一個池子!當我們訪問資料庫時我們直接從這個池子中拿連線物件即可,省去了初始化建立的過程,大大提高了效率。而且這個池子可以控制資料庫連線的數量,我們裡邊可以至少放上幾個,不夠用了再進行建立,最多能夠建立幾個等等來控制連線的數量。它就是這麼一個技術。準確一點說,連線池是一種快取技術(cache),因為這個池子是在快取中存放的。
三,連線池的優勢呢?
其實就是解決了JDBC的劣勢。提前準備好連線物件,提高了訪問效率,控制連線數量,防止同時過多使用者訪問導致效能大大降低,資料庫崩潰。
四,DBCP怎麼使用?
編寫資料庫連線池是比較麻煩的,而且編寫出來的效果如何另說。所以一般我們都使用現成的。各種伺服器都為我們提供了,這裡先看一下
1,在tomcat的catalina_home/webapps/webapp/meta-inf/目錄下新建context.xml檔案,來編寫DBCP,這是針對此應用程式的(當然也可以之間在tomcat的catalina_home/conf/context.xml中編寫,這個這個是針對這個tomcat伺服器的),編寫內容如下:
<?xml version="1.0" encoding="GBK"?>
<!--這是資料連線池的配置檔案,只有name可以自己定義 -->
<Context reloadable="true">
<Resource name="jdbc/ljh"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="ljh"
password="ljh"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.1.27:1521:ljh"
/>
</Context>
大家可以通過名字看出,這都是在設定dbcp的各個屬性,例如,最大連線數,最小連線數,最長等待時間等等,設定好以後我們就可以使用了。
那麼怎麼使用呢?這裡就涉及到了JNDI,JNDI是J2EE13個規範之一,也是非常重要的。這裡我來先簡單介紹一下JNDI:
- JNDI(Java Naming and Directory Interface) java命名和目錄服務介面
- 降低程式和程式之間的耦合性
- 降低裝置和裝置的耦合性
- Tomcat伺服器實現了JNDI服務,啟動Tomcat伺服器,等同於啟動JNDI伺服器
- JNDI是SUN制定的一套規範,這套規範可以和JDBC進行類比,JDBC也是一套規範,我們面向JDBC介面呼叫就可以獲取資料庫中的資料。同樣,我們面向JNDI介面呼叫,可以獲取“資源”,這個資源不是在底層資料庫中。
- JNDI提供了一種服務,這個服務可以將“名稱”和“資源”進行繫結,然後程式設計師通過面向JNDI介面呼叫方法lookup可以查詢到相關的資源。
看我們怎麼通過JNDI來獲取連線池:
//獲取JNDI的上下文物件Context
Context context = new InitialContext();
//根據名稱和資源的繫結來獲取資料來源連線池,其中java:/com/env是tomcat實現JNDI的路徑,後邊是我們連線池名字
DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/ljh");
//get,獲取一種的一個連線,當然下邊的close就是返回一個連線給連線池,這裡的連線池都對Connection中的方法進行重寫,例如close,是返回給連線池,而不是關閉資料庫連線。
conn = ds.getConnection();
這樣我們就可以使用連線物件了。
綜上為連線池DBCP和JNDI的聯合使用訪問資料庫。在實際開發中我們經常使用C3P0連線池,因為它開源的,而且和各種框架一起使用非常方便,效率也更高。不過原理跟上邊的差不多,都是依賴JDBC規範和JNDI
綜上為資料庫連線,順便簡單總結了一下JNDI。資料庫連線在每個系統中都會使用,雖然可能就需要我們配置一次,編寫一次,但是是非常重要的,因為資料的安全是非常重要的哈。所以還是需要我們好好掌握的。