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中的数据源配置,如下:
- <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能存活的最大时间。
3)项目中正常引入这个数据源即可,代码不需要任何修改
二。Hibernate(spring+hibernate):不推荐,完全可以使用第一种和第三种方法代替。
1)项目中引入C3P0的JAR
2)修改Hibernate中的配置(我使用的是Spring+Hibernate),如下:
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="mappingLocations" value="${hibernate.mapping.locations}" />
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- ${hibernate.dialect}
- </prop>
- <prop key="hibernate.show_sql">
- ${hibernate.show_sql}
- </prop>
- <prop key="hibernate.use_sql_comments">
- ${hibernate.use_sql_comments}
- </prop>
- <prop key="hibernate.connection.provider_class">
- org.hibernate.connection.C3P0ConnectionProvider
- </prop>
- <!--连接池的最小连接数 -->
- <prop key="hibernate.c3p0.min_size">
- 5
- </prop>
- <!--最大连接数 -->
- <prop key="hibernate.c3p0.max_size">
- 50
- </prop>
- <!--连接超时时间 -->
- <prop key="hibernate.c3p0.timeout">
- 120
- </prop>
- <!--statemnets缓存大小 -->
- <prop key="hibernate.c3p0.max_statements">
- 100
- </prop>
- <!--每隔多少秒检测连接是否可正常使用 -->
- <prop key="hibernate.c3p0.idle_test_period">
- 120
- </prop>
- <!--当池中的连接耗尽的时候,一次性增加的连接数量,默认为3 -->
- <prop key="hibernate.c3p0.acquire_increment">
- 2
- </prop>
- <!-- 每次都验证连接是否可用 -->
- <prop key="hibernate.c3p0.validate">
- true
- </prop>
- </props>
- </property>
- </bean>
3)这里的dataSource可以是jndi。
三。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://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数据库连接池的更多相关文章
-
【Java EE 学习 16 上】【dbcp数据库连接池】【c3p0数据库连接池】
一.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: package day16.utils; import java.io.IOException; import java.lang.ref ...
-
paip.c3p0 数据库连接池 NullPointerException 的解决...
paip.c3p0 数据库连接池 NullPointerException 的解决... 程序ide里面运行正常..外面bat运行错误.. 作者Attilax 艾龙, EMAIL:14665198 ...
-
paip.提升稳定性---c3p0数据库连接池不能取到连接An attempt by a client to checkout a Connection has timed out
paip.提升稳定性---c3p0数据库连接池不能取到连接An attempt by a client to checkout a Connection has timed out 作者Attilax ...
-
[原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
-
c3p0数据库连接池(作用不重复)
/* * c3p0数据库连接池: * 只被初始化一次 * connection对象进行close时,不是正的关闭,而是将该数据连接归还给数据库连接池 * * */ 四个架包 mysql-connect ...
-
springboot 使用c3p0数据库连接池
springboot 使用c3p0数据库连接池的方法 本文转自:http://www.cnblogs.com/xiaosiyuan/p/6255292.html 使用springboot开发时,默认 ...
-
c3p0 数据库连接池相关知识
c3p0数据库连接池的配置文件放在eclipse的src目录下,代码就可以识别. c3p0的配置文件的内容如下: <!-- Uncomment and set any of the option ...
-
c3p0数据库连接池无法连接数据库—错误使用了username关键字
一.问题描述 上篇博客说到了关于maven无法下载依赖jar包的问题,这篇博客再说一下关于在本个项目中遇到的关于使用C3P0连接池连接数据库的问题,真心很奇葩,在此,也请大家引起注意.首先看我的项目基 ...
-
C3P0数据库连接池使用方法
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
-
c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一、连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一.连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 DB连接池HikariCP为什么如此快 原创: D ...
随机推荐
-
ehcache基本使用
maven <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache< ...
-
Android——旋转屏幕导致Activity重建解决方法
Android开发文档上专门有一小节解释这个问题.简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系 ...
-
hyperstart 容器创建流程分析
hyperstart中运行的pod的核心数据结构如下所示: struct hyper_pod { struct hyper_interface *iface; struct hyper_route * ...
-
IIS、Asp.net 编译时的临时文件路径(转载)
IIS上部署的ASP.NET站点都会在一个.Net Framework的特定目录下生成临时编译文件增加ASP.NET站点的访问性能,有时候需要手动去删除这些临时编译文件,特别是发布新版本代码到IIS后 ...
-
Android UsageStatsService(应用使用统计服务)的学习与调研
一. 简介 UsageStatsService是一个系统服务,其主要通过AMS等,来监测并记录各个应用的使用数据,如上次调用com.android.settings的时间等. UsageStatsSe ...
-
openldap 编译报错MozNSS not found
openldap 编译报错 1)报错 MozNSS not found - please specify the location to the NSPR and NSS header files i ...
-
directive例子2
(function() { angular.module('app.widgets') .directive('bsModalPlus', function($window, $sce, $modal ...
-
常用网络名词mark &; 网络学习笔记
自 治 系 统 ( A S, A utonomous System ) IGP 内部网关协议 I n t e r i o r G a t e w a y P r o t o c o l 域 内 选 路 ...
-
php时间戳和日期转换,以及时间戳和星期转换
$this->created_at为时间戳值,转换日期如下 date('m.d',$this->created_at) : y 代表年的后两位如 17 ,Y 代表 2017 , m 代 ...
-
一次http请求中的信息
什么是Http 一次http传输,是由请求报文和响应报文来完成的 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World W ...