在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