C3P0配置实战

1.C3P0是什么?
   C3P0: 一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.
2.C3P0的作用 
  除了hibernate官网推荐(Hibernate会采用内建的连接池,但性能不佳),还解决数据库重启后tomcat在不需要重启的情况下即可重新获得数据连接的问题。
3.C3P0的使用
 1.JNDI(项目比较常用,最简单,与代码无关联)
     1)在tomcat或者项目中引入最新版的C3P0的JAR包(我是用的是c3p0-0.9.2.1.jar)
       如果启动时报类没有找到:Caused by: java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector,则需要加入mchange-commons-java-0.2.3.4.jar。
     2)修改tomcat中的数据源配置,如下:
     Xml代码 
    <Resource name="jdbc/dbsource"type="com.mchange.v2.c3p0.ComboPooledDataSource"maxPoolSize="50" minPoolSize="5" acquireIncrement="2"
initialPoolSize="10" maxIdleTime="60"factory="org.apache.naming.factory.BeanFactory"user="xxxx" password="xxxx" driverClass="oracle.jdbc.driver.OracleDriver" 
jdbcUrl="jdbc:oracle:thin:@192.168.x.x:1521:orcl"idleConnectionTestPeriod="10" />
参数说明:
(1)idleConnectionTestPeriod
当数据库重启后或者由于某种原因进程被杀掉后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时会报错误(因为连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。
C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts【默认为30】 )。
要解决此问题,可以通过设置idleConnectionTestPeriod【默认为0,表示不检查 】参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒 。
(2)acquireIncrement
当连接池中的的连接耗尽的时候c3p0一次同时获取的连接数,也就是说,如果使用的连接数已经达到了maxPoolSize,c3p0会立即建立新的连接。
(3)maxIdleTime
另外,C3P0默认不会close掉不用的连接池,而是将其回收到可用连接池中,这样会导致,连接数越来越大,所以需要设置maxIdleTime【默认0,表示永远不过期】,单位是秒,maxIdleTime表示idle状态的connection能存活的最大时间。 
  2.dataSource(spring,开发常用)
如果使用spring,同时项目中不使用jndi,又不想配置到Hibernate中,可以直接将C3P0配置到dataSource中即可,代码如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>
  <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>
  <property name="user"><value>Kay</value></property>
  <property name="password"><value>root</value></property>
  <!--连接池中保留的最小连接数。-->
  <property name="minPoolSize" value="10" />
  <!--连接池中保留的最大连接数。Default: 15 -->
  <property name="maxPoolSize" value="100" />
  <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
  <property name="maxIdleTime" value="1800" />
  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
  <property name="acquireIncrement" value="3" />
  <property name="maxStatements" value="1000" />
  <property name="initialPoolSize" value="10" />
  <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
  <property name="idleConnectionTestPeriod" value="60" />
  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
  <property name="acquireRetryAttempts" value="30" />
  <property name="breakAfterAcquireFailure" value="true" />
  <property name="testConnectionOnCheckout" value="false" />
  </bean>
相关链接:http://hanqunfeng.iteye.com/blog/1671412





你可能感兴趣的:(C3P0配置实战)