瞭解資料庫連線池

banq發表於2016-11-22
1.介紹

連線池是事先開啟N個資料庫連線放入池中進行管理的效能最佳化技術。應用程式只需要一個連線,使使用完以後將其放回池中。 當應用程式需要連線時,池中總是保持就緒可用連線。池管理連線生命週期,使得開發人員實際上不需要等待連線的建立過程並過濾掉過時的連線。

連線池機制節省了執行時建立網路連線的昂貴成本,總是在後臺初始化資料庫會話。

2. TOMCAT中的連線池實現

Tomcat中是領先的應用伺服器,Commons DBCP資料來源作為其預設的JNDI資料來源,除非我們明確指定DataSourceFactory,以下是使用方式:

使用Apache Commons DBCP連線池 -

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
	maxActive="100" maxIdle="30" maxWait="10000"
	username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/javatest" 
        factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>
<p class="indent">



 使用 Tomcat JDBC Connection pool :


<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
	maxActive="100" maxIdle="30" maxWait="10000"
	username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/javatest" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

<p class="indent">


factory是必需的, 型別應始終為javax.sql.DataSource


DBCP的優點是它可以與許多應用程式或框架一起使用,並且它幾乎能與市場上的所有資料庫一起工作。

3.比較連線池機制

當使用Commons DBCP連線池機制,Tomcat獲取Commons DBCP源(版本取決於Tomcat的版本,例如Tomcat的7.0.27使用Commons DBCP 1.4),並執行包的名稱替換(org.apache.commons - > org.apache.tomcat.dbcp)並構建成Tomcat-dbcp.jar。 這樣做是為了使內部Tomcat JDBC池不會與Commons DBCP類的應用程式使用發生衝突。 這避免了許多潛在的類載入問題。“dbcp”包是關於資料來源管理的。

同樣,Tomcat的JDBC連線池機制(org.apache.tomcat.jdbc.pool.*)是與Commons DBCP資料庫連線池競爭的替代升級實現。 它是一個Tomcat分離出單獨的專案(在Tomcat模組 - > jdbc-pool),它首次配置於Tomcat 7(2011年7月7.0.19開始)。這兩個實現都有優點和缺點,然而Apache Commons DBCP仍然被更普遍使用。

在這兩種情況下,相應的JAR檔案( commons-dbcp.jar 或 tomcat-jdbc.jar)都需要被納入構建路徑。

舊版本的Apache Commons DBCP(即版本1.2)在高負載條件下有一些討厭的執行緒安全問題,使得它不適合被再使用,這就是為什麼重寫Tomcat JDBC連線池原因。
使用Tomcat JDBC連線池也很簡單,對於已經熟悉DBCP的人來說,轉換也是相當簡單的。

4.在HIBERNATE中的連線池

Hibernate使用它的魔法來標識要使用的連線池提供程式 - 基於您配置的屬性。

對於c3p0 -

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<p class="indent">



對於Apache Commons DBCP -

<property name="hibernate.dbcp.initialSize">8</property>
<property name="hibernate.dbcp.maxActive">20</property>
<property name="hibernate.dbcp.maxIdle">20</property>
<property name="hibernate.dbcp.minIdle">0</property>
<p class="indent">


相應的JAR檔案需要位於lib目錄中,手動配置或使用Maven。

我們也可以使用hibernate.connection.provider_class屬性顯式指定連線提供者,但其並不真正需要。

<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">19</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">10</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<p class="indent">


如果我們不配置與Hibernate連線池,則使用預設的,當我們啟動應用程式,在日誌或控制檯輸出中可見-

org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure


Hibernate中預設的連線池實現不適合生產使用,因為它的配置限制了。如果您使用應用程式伺服器,則可能希望使用內建池(通常使用JNDI獲取連線)。

使用JNDI配置讓Hibernate使用伺服器的內建池,我們需要將以下屬性設定到Hibernate配置檔案中 -


hibernate.connection.datasource=java:/comp/env/jdbc/TestDB

- 假設TestDB是Tomcat JDBC連線池DataSource的JNDI名稱(參考上面第2節中的程式碼片段)。

如果您不能或不希望使用應用程式伺服器的內建連線池,Hibernate支援其他幾個連線池,例如 -

c3p0
Proxool
Apache的DBCP之後,C3P0是第二個最好的連線池的實現,容易與Hibernate整合,據說能夠提供良好的效能。



Understanding Connection Pooling - jCombat

相關文章