數據庫鏈接池的配置

 

目前數據庫鏈接池產品是很是多的,DBCP、C3P0、Proxool等都是很是優秀的產品。鏈接池的性能和穩定性會對咱們的程序形成極大的影響,所以, 有必要對這些鏈接池產品進行一些選擇。另外,鏈接池的配置是否恰當,將會決定該鏈接池的性能和穩定性表現,因此,本文將給出鏈接池配置的一些要點。在這些 鏈接池產品中做出選擇是比較困難的,每一個優秀的產品都有它自身的特色,並且也很難找出一個在各類運行環境中都最表現最優的產品,所以,本文將選出一些目前 來講比較優秀的產品,簡要介紹一下它們的配置要點,以及如何使用在咱們的項目中。至於在生產環境中,哪一種產品會表現最好,則...。

Hibernate開發組推薦使用c3p0,spring開發組推薦使用dbcp(dbcp鏈接池有weblogic鏈接池一樣的問題,就是 強行關閉鏈接或數據庫重啓後,沒法reconnect,但可經過配置來解決),Hibernate in action推薦使用c3p0和proxool。其它還有很多商業產品,但性能與穩定性的總體表現反而不如這些開源數據庫鏈接池。從網上的搜索狀況來看, 也是DBCP、C3P0、Proxool的使用較爲普遍。可是關於它們的性能與穩定性,衆說不一,難以獲得結論。
DBCP是Apache出品的,開發也較爲活躍,也是使用極爲普遍的一個數據庫鏈接池產品。從網上搜索的資料以及本身以往使用DBCP的經驗 來看,DBCP的穩定性有些問題。可是它的開發較爲活躍,因此咱們能夠相信它會解決這些問題,並且有些問題是能夠經過額外的配置來解決的。
C3P0,穩定性彷佛不錯,在這方面彷佛有很好的口碑。至於性能,應該不是最好的,算是中規中矩的類型。
Proxool的口碑彷佛很好,不大見到負面的評價,從官方資料上來看,有許多有用的特性和特色,也是許多人推薦的。可是開發不夠活躍,使用者也較少。
我選定這三個產品做爲咱們系統的數據庫鏈接池,並使用Proxool做爲目前開發環境中的鏈接池產品(Proxool便於監控)。
使用和配置

使用

三個產品都能很方便地整合到Springframework中,也均可以配置爲JNDI資源,所以,它們能夠隨意更換,不會影響程序代碼。在 生產環境中,若是須要開放咱們的數據庫給其它系統使用或共享,我推薦使用應用服務器的JNDI。在開發環境中,咱們不使用JNDI。如下的配置是不使用 JNDI時的Spring配置,至於JNDI的配置,請參考相關文檔,該文不作敘述,但配置項基本相同。
DBCP

DBCP是Apache的一個開源項目(http://jakarta.apache.org/commons/dbcp /index.html),它依賴Apache的另外2個開源項目:commons.collections和commons.pool。下載這些包並將 這些包的路徑添加到classpath中就可使用dbcp作爲項目中的數據庫鏈接池使用了。在咱們的項目中,可經過Maven來管理。
在配置時,不經常使用但在生產環境中頗有用的參數有:removeAbandoned 、removeAbandonedTimeout、maxWait。若是設置了rmoveAbandoned=true,那麼在 getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的 Connection爲removeAbandonedTimeout(默認300秒)中設置的秒數後沒有使用的Connection。
若是設置了logAbandoned=true,DBCP將會在回收Connection以後,打印回收Connection的錯誤信息,包括在哪一個地方用了Connection卻忘記關閉了這樣的信息,在調試的時候頗有用。
基本配置以下: html

Java代碼   收藏代碼
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2. <property name="driverClassName" value="${db.driverClassName}"/>  
  3. <property name="url" value="${db.url}"/>  
  4. <property name="username" value="${db.username}"/>  
  5. <property name="password" value="${db.password}"/>  
  6. <!--initialSize: 初始化鏈接-->  
  7. <property name="initialSize" value="5"/>  
  8. <!--maxIdle: 最大空閒鏈接-->  
  9. <property name="maxIdle" value="10"/>  
  10. <!--minIdle: 最小空閒鏈接-->  
  11. <property name="minIdle" value="5"/>  
  12. <!--maxActive: 最大鏈接數量-->  
  13. <property name="maxActive" value="15"/>  
  14. <!--removeAbandoned: 是否自動回收超時鏈接-->  
  15. <property name="removeAbandoned" value="true"/>  
  16. <!--removeAbandonedTimeout: 超時時間(以秒數爲單位)-->  
  17. <property name="removeAbandonedTimeout" value="180"/>  
  18. <!--maxWait: 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒-->  
  19. <property name="maxWait" value="3000"/>  
  20. <property name="validationQuery">  
  21. <value>SELECT 1</value>  
  22. </property>  
  23. <property name="testOnBorrow">  
  24. <value>true</value>  
  25. </property>  
  26. </bean>  

C3P0mysql



  C3P0受到很多人的推薦,官方地址是:http://sourceforge.net/projects/c3p0。基本配置以下:web


Java代碼   收藏代碼
  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
  2.   <property name="driverClass" value="${db.driverClassName}"/>  
  3.   <property name="jdbcUrl" value="${db.url}"/>  
  4. <!--  
  5.   <property name="user" value="${db.user}"/>  
  6.   <property name="password" value="${db.pass}"/>  
  7. -->  
  8.   <property name="properties">  
  9.     <props>  
  10.       <!--當鏈接池中的鏈接耗盡的時候c3p0一次同時獲取的鏈接數。Default: 3-->  
  11.       <prop key="c3p0.acquire_increment">5</prop>  
  12.       <!--每60秒檢查全部鏈接池中的空閒鏈接。Default: 0 -->   
  13.       <prop key="c3p0.idle_test_period">60</prop>  
  14.       <prop key="c3p0.max_size">15</prop>  
  15.       <prop key="c3p0.max_statements">0</prop>  
  16.       <prop key="c3p0.min_size">10</prop>  
  17.       <prop key="user">${db.user}</prop>  
  18.       <prop key="password">${db.pass}</prop>  
  19.     </props>  
  20.   </property>  
  21. </bean>  

Proxoolspring



  這是一個Java SQL Driver驅動程序,能夠透明地爲你現存的JDBC驅動程序增長鏈接池的功能。另外它提供一個Web監控程序,能夠實時的查看你係統全部鏈接池的使用情 況。官方地址:http://proxool.sourceforge.net。Proxool的配置方式有多種,相似於以上配置的方式以下:sql


Java代碼   收藏代碼
  1. <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">  
  2.   <property name="driver" value="${db.driverClassName}"/>  
  3.   <property name="driverUrl" value="${db.url}"/>  
  4.  <!--用戶名和密碼寫在一塊兒才調用成功,否則會報 調用無效的參數 錯誤,下面設置用戶名和密碼的property好像是無效的,其它數據庫也是這樣  
  5.  好比mysql的也要把用戶名和密碼寫在url裏:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&amp;password=lizongbo" />  
  6.  -->  
  7.   <property name="user" value="${db.user}"/>  
  8.   <property name="password" value="${db.pass}"/>  
  9.   <property name="alias" value="${db.alias}"/>  
  10.   <property name="houseKeepingSleepTime" value="90000"/>  
  11.   <property name="prototypeCount" value="5"/>  
  12.   <property name="maximumConnectionCount" value="100"/>  
  13.   <property name="minimumConnectionCount" value="10"/>  
  14.   <property name="trace" value="true"/>  
  15.   <property name="verbose" value="true"/>  
  16. </bean>  

另外,也能夠在單獨的一個文件中配置Proxool。好比,在WEB-INF/下創建proxool.xml文件:數據庫


Java代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <proxool-config>  
  3.   <proxool>  
  4.     <alias>mimir</alias>  
  5.     <driver-url>jdbc:mysql://localhost:3306/dbname?user=username&amp;password= password"</driver-url>  
  6.     <driver-class>com.mysql.jdbc.Driver</driver-class>  
  7.     <driver-properties>  
  8.       <property name="user" value="username"/>  
  9.       <property name="password" value="password"/>  
  10.     </driver-properties>  
  11.     <maximum-connection-count>10</maximum-connection-count>  
  12.     <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql>  
  13.   </proxool>  
  14. </proxool-config>  

而後,須要在應用系統啓動時讀入這個文件。Proxool提供了一個Servlet來作這個事情,編輯WEB-INF/web.xml,加入如下幾行:apache


Java代碼   收藏代碼
  1. <servlet>  
  2.   <servlet-name>proxoolServletConfigurator</servlet-name>  
  3.   <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>  
  4.   <init-param>  
  5.     <param-name>xmlFile</param-name>  
  6.     <param-value>WEB-INF/proxool.xml</param-value>  
  7.   </init-param>  
  8.   <load-on-startup>1</load-on-startup>  
  9. </servlet>  

而後,在Spring的配置中能夠這樣寫:服務器


Java代碼   收藏代碼
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  2.   <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/>  
  3.   <property name="url" value="proxool.xxx"/>  
  4. </bean>  

若是須要監控,能夠在WEB-INF/web.xml中加上:app


Java代碼   收藏代碼
  1. <servlet>  
  2.   <servlet-name>proxooladmin</servlet-name>  
  3.   <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.   <servlet-name>proxooladmin</servlet-name>  
  7.   <url-pattern>/proxooladmin</url-pattern>  
  8. </servlet-mapping> 
相關文章
相關標籤/搜索