在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框架下常用的两种数据源的连接池配置就到这里。