C3P0: 一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,因此官方也只是建议仅在开发环境下使用。Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool。

这里说一下为什么一定要使用C3P0吧:

1)hibernate官网推荐

2)  解决数据库重启后tomcat在不需要重启的情况下即可重新获得数据连接的问题。

下载:http://www.mchange.com/projects/c3p0/index.html

这里说一下如何配置,网上其实有好多,我只是根据项目需要整理了一下,一共3种,大家根据需要来配置。

一。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中的数据源配置,如下:

  1. <Resource name="jdbc/dbsource"
  2. type="com.mchange.v2.c3p0.ComboPooledDataSource"
  3. maxPoolSize="50" minPoolSize="5" acquireIncrement="2"  initialPoolSize="10"  maxIdleTime="60"
  4. factory="org.apache.naming.factory.BeanFactory"
  5. user="xxxx" password="xxxx"
  6. driverClass="oracle.jdbc.driver.OracleDriver"
  7. jdbcUrl="jdbc:oracle:thin:@192.168.x.x:1521:orcl"
  8. idleConnectionTestPeriod="10" />

参数说明:

(1)idleConnectionTestPeriod

当数据库重启后或者由于某种原因进程被杀掉后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时会报错误(因为连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。

C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts【默认为30】 )。

要解决此问题,可以通过设置idleConnectionTestPeriod【默认为0,表示不检查 】参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒 。

(2)acquireIncrement

当连接池中的的连接耗尽的时候c3p0一次同时获取的连接数,也就是说,如果使用的连接数已经达到了maxPoolSize,c3p0会立即建立新的连接。

(3)maxIdleTime

另外,C3P0默认不会close掉不用的连接池,而是将其回收到可用连接池中,这样会导致,连接数越来越大,所以需要设置maxIdleTime【默认0,表示永远不过期】,单位是秒,maxIdleTime表示idle状态的connection能存活的最大时间。

3)项目中正常引入这个数据源即可,代码不需要任何修改

二。Hibernate(spring+hibernate):不推荐,完全可以使用第一种和第三种方法代替。

1)项目中引入C3P0的JAR

2)修改Hibernate中的配置(我使用的是Spring+Hibernate),如下:

  1. <bean id="sessionFactory"
  2. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource"/>
  4. <property name="mappingLocations" value="${hibernate.mapping.locations}" />
  5. <property name="hibernateProperties">
  6. <props>
  7. <prop key="hibernate.dialect">
  8. ${hibernate.dialect}
  9. </prop>
  10. <prop key="hibernate.show_sql">
  11. ${hibernate.show_sql}
  12. </prop>
  13. <prop key="hibernate.use_sql_comments">
  14. ${hibernate.use_sql_comments}
  15. </prop>
  16. <prop key="hibernate.connection.provider_class">
  17. org.hibernate.connection.C3P0ConnectionProvider
  18. </prop>
  19. <!--连接池的最小连接数 -->
  20. <prop key="hibernate.c3p0.min_size">
  21. 5
  22. </prop>
  23. <!--最大连接数 -->
  24. <prop key="hibernate.c3p0.max_size">
  25. 50
  26. </prop>
  27. <!--连接超时时间 -->
  28. <prop key="hibernate.c3p0.timeout">
  29. 120
  30. </prop>
  31. <!--statemnets缓存大小 -->
  32. <prop key="hibernate.c3p0.max_statements">
  33. 100
  34. </prop>
  35. <!--每隔多少秒检测连接是否可正常使用 -->
  36. <prop key="hibernate.c3p0.idle_test_period">
  37. 120
  38. </prop>
  39. <!--当池中的连接耗尽的时候,一次性增加的连接数量,默认为3 -->
  40. <prop key="hibernate.c3p0.acquire_increment">
  41. 2
  42. </prop>
  43. <!-- 每次都验证连接是否可用 -->
  44. <prop key="hibernate.c3p0.validate">
  45. true
  46. </prop>
  47. </props>
  48. </property>
  49. </bean>

3)这里的dataSource可以是jndi。

三。dataSource(spring,开发常用)

如果使用spring,同时项目中不使用jndi,又不想配置到Hibernate中,可以直接将C3P0配置到dataSource中即可,如下:

  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  2.   <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>
  3.   <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>
  4.   <property name="user"><value>Kay</value></property>
  5.   <property name="password"><value>root</value></property>
  6.   <!--连接池中保留的最小连接数。-->
  7.   <property name="minPoolSize" value="10" />
  8.   <!--连接池中保留的最大连接数。Default: 15 -->
  9.   <property name="maxPoolSize" value="100" />
  10.   <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
  11.   <property name="maxIdleTime" value="1800" />
  12.   <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
  13.   <property name="acquireIncrement" value="3" />
  14.   <property name="maxStatements" value="1000" />
  15.   <property name="initialPoolSize" value="10" />
  16.   <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
  17.   <property name="idleConnectionTestPeriod" value="60" />
  18.   <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
  19.   <property name="acquireRetryAttempts" value="30" />
  20.   <property name="breakAfterAcquireFailure" value="true" />
  21.   <property name="testConnectionOnCheckout" value="false" />
  22.   </bean>

参考资料:

参数说明:http://baike.baidu.com/view/920062.htm

Hibernate连接池配置:http://dengjianqiang200.blog.163.com/blog/static/658119201032313017139

Jndi 与 c3p0 结合:http://yakar.iteye.com/blog/356243

C3P0容错和自动重连特性:http://hi.baidu.com/ivexrhlaozbdqtq/item/ad9572973a5312f2291647b1

C3P0配置实战的更多相关文章

  1. Tomcat下使用c3p0配置jndi数据源

    下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...

  2. c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗?

    c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗? c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗 ...

  3. JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  4. PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战

    原文 PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战 环境配置:   程序准备: PHP windows版本下载地址: http://windows.php. ...

  5. Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包

  6. 深入浅出 SSL 管理配置实战

    我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物.网银转账.支付宝付款.搜索信息.查看邮件.观看视频.微信聊天.上网冲浪.阅读新闻等,无不时时刻刻在和网络打交道.那如何保护网络安全就相 ...

  7. JNDI学习总结——Tomcat下使用C3P0配置JNDI数据源

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  8. spring中通过JNDI、DBCP、C3P0配置数据源

    JNDI配置数据源 1.首先在tomcat的server.xml中配置数据源信息,找到Context,然后在里边加入如下代码 <Context docBase="SpringDemo& ...

  9. spring c3p0 配置

      spring c3p0 配置   <?xml version="1.0" encoding="UTF-8"?> <beansxmlns=& ...

随机推荐

  1. jQuery中.bind() .live() .delegate() .on()区别

    $(selector).bind(event,data,function) $(selector).live(event,data,function)//jquery1.9版本以下支持,jquery1 ...

  2. css3之transform属性实现div不定宽高垂直水平居中

    transform的作用 transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜.(w3cschool) transform的兼容性 transfor ...

  3. 如何在PeopleSoft中找到并更改默认样式表名称

    PeopleSoft的默认样式表名称是用来控制应用程序的外观的.在PeopleSoft中可以使用集中样式表来更改应用程序的外观,oracle为每个应用程序版本设置了默认的样式表. 下面是不同应用程序版 ...

  4. css 常用的几种垂直居中(包括图片)

    我知道现在有非常多的水平垂直居中的写法,我就写一些我自己常用的方法,同时说明一下优缺点 <div class="wrapper"> <div class=&quo ...

  5. FineReport中如何安装移动端H5插件

    1. HTML5报表插件安装及使用编辑 插件安装 插件网址以及设计器插件安装方法和服务器安装插件的方法可以官网上面搜索,这里就不做详细介绍了. 移动端HTML5报表使用方法 安装好插件后,在浏览器中调 ...

  6. Echarts柱状图百分比显示

    option = { tooltip: { trigger: 'item', formatter:'{c}%' //这是关键,在需要的地方加上就行了 }, grid: { borderWidth: 0 ...

  7. 带你从零学ReactNative开发跨平台App开发(二)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  8. Chrome下解决本地异步请求失败的问题(Origin null is not allowed by Access-Control-Allow-Origin. )

    Chrome更新版本后发现打开本地Jquery easyui没有数据,查看控制台才发现如下问题解决的办法是设置启动参数"--allow-file-access-from-files" ...

  9. Python+Selenium笔记(十四)鼠标与键盘事件

     (一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的Ac ...

  10. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...