1. 程式人生 > >資料連線池——JNDI

資料連線池——JNDI

資料庫連線有很多中方式,JDBC資料庫的連線方式,前邊我們已經介紹過了,而開發中我們經常使用的是DataBaseConnectionPool(資料庫連線池,DBCP)。資料庫連線池到底是什麼?它比jdbc資料庫連線有什麼優勢呢?它又怎麼使用呢?

一,先看一下JDBC連線,每次使用者訪問資料庫時,需要JDBC為我們建立資料庫連線,我們使用,然後關閉。而當我們加斷點測試,可以發現這個過程中建立資料庫連線這個過程是比較費時間的,而不是我們在資料庫中操作資料費時間。所以JDBC這種方式的效率大大折扣。而且如果過多的人同時併發來訪問資料庫,連線數量建立過多,會導致效能降低,更嚴重可能會導致資料庫崩潰。而,資料庫連線池就是來解決這兩種問題的。

二,資料庫連線池是什麼?

顧名思義就是盛放多個數據庫連線的一個池子!當我們訪問資料庫時我們直接從這個池子中拿連線物件即可,省去了初始化建立的過程,大大提高了效率。而且這個池子可以控制資料庫連線的數量,我們裡邊可以至少放上幾個,不夠用了再進行建立,最多能夠建立幾個等等來控制連線的數量。它就是這麼一個技術。準確一點說,連線池是一種快取技術(cache,因為這個池子是在快取中存放的。

三,連線池的優勢呢?

其實就是解決了JDBC的劣勢。提前準備好連線物件,提高了訪問效率,控制連線數量,防止同時過多使用者訪問導致效能大大降低,資料庫崩潰。

四,DBCP怎麼使用?

編寫資料庫連線池是比較麻煩的,而且編寫出來的效果如何另說。所以一般我們都使用現成的。各種伺服器都為我們提供了,這裡先看一下

Tomcat伺服器的資料庫連線池如何使用。

          1,在tomcatcatalina_home/webapps/webapp/meta-inf/目錄下新建context.xml檔案,來編寫DBCP,這是針對此應用程式的(當然也可以之間在tomcatcatalina_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的各個屬性,例如,最大連線數,最小連線數,最長等待時間等等,設定好以後我們就可以使用了。

那麼怎麼使用呢?這裡就涉及到了JNDIJNDIJ2EE13個規範之一,也是非常重要的。這裡我來先簡單介紹一下JNDI

  • JNDIJava Naming and Directory Interface java命名和目錄服務介面
  • 降低程式和程式之間的耦合性
  • 降低裝置和裝置的耦合性
  • Tomcat伺服器實現了JNDI服務,啟動Tomcat伺服器,等同於啟動JNDI伺服器
  • JNDISUN制定的一套規範,這套規範可以和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();

這樣我們就可以使用連線物件了。

綜上為連線池DBCPJNDI的聯合使用訪問資料庫。在實際開發中我們經常使用C3P0連線池,因為它開源的,而且和各種框架一起使用非常方便,效率也更高。不過原理跟上邊的差不多,都是依賴JDBC規範和JNDI

綜上為資料庫連線,順便簡單總結了一下JNDI。資料庫連線在每個系統中都會使用,雖然可能就需要我們配置一次,編寫一次,但是是非常重要的,因為資料的安全是非常重要的哈。所以還是需要我們好好掌握的。