在hibernate和spring的框架中常常會用到c3pO數據庫鏈接池
這裏本身理解一下c3pO,首先它是一個開源的JDBC的鏈接池,實現了數據源和JNDI綁定,支持JDBC3node
規範和JDBC2的標準擴展。mysql
首先咱們要在項目中引c3pO-0.9.1.2jar包
好比我本身項目的Spring3.0的框架中上下文XML的配置中,配置以下:鏈接oracle數據庫的例子
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-
method="close" lazy-init="false">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.78.68:1521:ora10g"/>
<property name="user" value="bankday" />
<property name="password" value="m123456" />
<property name="testConnectionOnCheckin" value="true" />
<property name="automaticTestTable" value="TestTable" />
<property name="idleConnectionTestPeriod" value="18000" />
<property name="maxIdleTime" value="25000" />
<property name="testConnectionOnCheckout" value="true" />
</bean>
其中屬性testConnectionOnCheckin設置爲true的話,在取得鏈接的同時將校驗鏈接的有效性,默
認爲false
屬性automaticTestTable表示c3p0將建一張名爲TestTable的空表,並使用其自帶的查詢語句進行
測試。若是定義了這個參數那麼
屬性preferredTestQuery將被忽略。你不能在這張TestTable表上進行任何操做,它將只供c3p0測
試 使用。Default: null
其中屬性idleConnectionTestPeriod 表示每18000秒檢查全部鏈接池中的空閒鏈接。Default: 0
屬性 maxIdleTime表示最大空閒時間,25000秒內未使用則鏈接被丟棄。若爲0則永不丟棄。
Default: 0
屬性testConnectionOnCheckout的意義在於:因性能消耗大請只在須要的時候使用它。若是設爲
true那麼在每一個connection提交的
時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
等方法來提高鏈接測試的性能。Default: false
這裏要特別注意一個問題,在同一個tomcat下兩個web應用程序都使用了c3p0的
ComboPooledDataSource,致使啓動的收出一個警告,說"A C3P0Registry mbean is already
registered"或者「com.machange.v2.c3pO:type=c3pORegistry」。有兩個解決辦法,一是把c3p0 jars
和數據庫的驅動jar移到tomcat common lib下。
另一個就是根據官方文檔所說:
If you do not want c3p0 to register MBeans with your JMX environment, you can suppress
this behavior with the following, set either as a System property or in
c3p0.properties:
也就是加上一個c3p0.properties屬性文件:內容爲
com.mchange.v2.c3p0.management.ManagementCoordinator=com.mchange.v2.c3p0.management.Nu llManagementCoordinator
就能夠解決問題
這裏也比較一下spring的第三方依賴包中另外一種數據源的實現,就是Apache的DBCP,項目中須要
commons-dbcp.jar和commons-pool.jar兩個包。
一個是項目的application.properties配置文件,裏面是數據庫的鏈接信息
jdbc.driver=com.mysql.jdbc.Driver
useUnicode=true&characterEncoding=utf-8
jdbc.url=jdbc:mysql://localhost:3306/db01?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
devModel=true
server.node_name=default
server.addr=localhostH
在spring的上下文的配置中:
<context:property-placeholder ignore-unresolvable="true"
location="classpath*:/application.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- Connection Pooling Info -->
<property name="defaultAutoCommit" value="false" />
<!-- 鏈接Idle一個小時後超時 -->
<property name="timeBetweenEvictionRunsMillis" value="3600000" />
<property name="minEvictableIdleTimeMillis" value="3600000" />
</bean>
其中屬性:minEvictableIdleTimeMillis :鏈接池中鏈接,在時間段內一直空閒, 被逐出鏈接
池的時間
這裏兩種數據源的鏈接的屬性,只是根據我本身的須要解釋了一些,其餘的能夠搜索
他們二者的區別,一直配置寫法上一些細微的區別,而是c3pO也在配置屬性上比dbcp更加的豐富些
到此spring框架下經常使用的兩種數據源的鏈接池配置就到這裏。web
後續有不少開發填坑的文章發佈,若是對你有幫助,請支持和加關注一下spring