在hibernate和spring的框架中经常会用到c3pO数据库连接池
这里自己理解一下c3pO,首先它是一个开源的JDBC的连接池,实现了数据源和JNDI绑定,支持JDBC3

规范和JDBC2的标准扩展。

首先我们要在项目中引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框架下常用的两种数据源的连接池配置就到这里。


http://e22a.com/h.05ApkG?cv=AAKHZXVo&sm=339944

https://shop119727980.taobao.com/?spm=0.0.0.0