使用 JPA,有必要配置像 C3P0,这样的c3p0连接池配置吗

如何获取到C3P0连接池当前的状态
[问题点数:100分,结帖人fulong258]
如何获取到C3P0连接池当前的状态
[问题点数:100分,结帖人fulong258]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(10384)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Spring之C3P0连接池参数配置',
blogAbstract:'
本人使用的C3P0的jar包是:c3p0-0.9.1.jar
&bean id = \"dataSource\" class = \"com.mchange.boPooledDataSource\"&
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:9,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}数据库连接池C3P0学习 - haoran_10 - ITeye技术网站
博客分类:
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理。
一、实现方式:
C3P0有三种方式实现:
1.自己动手写代码,实现数据源
例如:在类路径下配置一个属性文件,config.properties,内容如下:
driverClass=xxx
jdbcUrl=xxx
password=xxx
然后代码中实现
Properties props = new Properties();
InputStream in = Thread.class.getResourceAsStream("config.properties");
props.load(in);
in.close();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));
这里实现了一个数据源。
也可以这样配置,在类路径下配置一个xml文件,config.xml
&source name="source1"&
&property name="user"&root&/property&
&property name="password"&xxx&/property&
&property name="url"&xxx&/property&
&property name="driverClass"&xxx&/property&
&source name="source2"&
然后自己解析xml文件,这样可以实现多个数据源的配置
2.配置默认的熟悉文件
类路径下提供一个c3p0.properties文件(不能改名)
配置如下:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
上面只提供了最基本的配置项,其他配置项参照 配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
DataSource
ds = new ComboPooledDataSource();
然后就可以使用数据源了,C3P0会对c3p0.properties进行自动解析的
3.路径下提供一个c3p0-config.xml文件
这种方式使用方式与第二种差不多,但是有更多的优点 (1).更直观明显,很类似hibernate和spring的配置(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
&c3p0-config&
&default-config&
&property name="user"&root&/property&
&property name="password"&java&/property&
&property name="driverClass"&com.mysql.jdbc.Driver&/property&
&property name="jdbcUrl"&jdbc:mysql://localhost:3306/jdbc&/property&
&property name="initialPoolSize"&10&/property&
&property name="maxIdleTime"&30&/property&
&property name="maxPoolSize"&100&/property&
&property name="minPoolSize"&10&/property&
&/default-config&
&named-config name="mySource"&
&property name="user"&root&/property&
&property name="password"&java&/property&
&property name="driverClass"&com.mysql.jdbc.Driver&/property&
&property name="jdbcUrl"&jdbc:mysql://localhost:3306/jdbc&/property&
&property name="initialPoolSize"&10&/property&
&property name="maxIdleTime"&30&/property&
&property name="maxPoolSize"&100&/property&
&property name="minPoolSize"&10&/property&
&/named-config&
&/c3p0-config&
DataSource
ds = new ComboPooledDataSource("mySource");
这样就可以使用数据源了。
二、部分参数配置说明:
1.最常用配置
initialPoolSize:连接池初始化时创建的连接数,default : 3(建议使用)
minPoolSize:连接池保持的最小连接数,default : 3(建议使用)
maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)
acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)
2.管理连接池的大小和连接的生存时间
maxConnectionAge:配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)
maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)
maxIdleTimeExcessConnections:这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)
3.配置连接测试:
automaticTestTable:配置一个表名,连接池根据这个表名用自己的测试sql语句在这个空表上测试数据库连接,这个表只能由c3p0来使用,用户不能操作。default : null(不建议使用)
preferredTestQuery:与上面的automaticTestTable二者只能选一。自己实现一条SQL检测语句。default : null(建议使用)
idleConnectionTestPeriod:用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无会话的状态打破。为0则不测试。default : 0(建议使用)
testConnectionOnCheckin:如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)
testConnectionOnCheckout:性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)
4.配置PreparedStatement缓存:
maxStatements:连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。同时maxStatementsPerConnection的配置无效。default : 0(不建议使用)
maxStatementsPerConnection:连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。default : 0(看情况而论)
5.重连相关配置
acquireRetryAttempts:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)
acquireRetryDelay:连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)
breakAfterAcquireFailure:如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。default : false(不建议使用)
checkoutTimeout:配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException。其实就是acquireRetryAttempts*acquireRetryDelay。default : 0(与上面两个,有重复,选择其中两个都行)
6.定制管理Connection的生命周期
connectionCustomizerClassName:用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在Connection丢弃的时候进行资源关闭,
就可以通过继承一个AbstractConnectionCustomizer来实现相关方法,配置的时候使用全类名。有点类似监听器的作用。default : null(不建议使用)
7.配置未提交的事务处理
autoCommitOnClose:连接池在回收数据库连接时是否自动提交事务。如果为false,则会回滚未提交的事务,如果为true,则会自动提交事务。default : false(不建议使用)
forceIgnoreUnresolvedTransactions:这个配置强烈不建议为true。default : false(不建议使用)
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
8.配置debug和回收Connection
unreturnedConnectionTimeout:为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭情况的不是很适用。建议手动关闭。default : 0 单位 s(不建议使用)
debugUnreturnedConnectionStackTraces:如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为打印堆栈信息会减慢getConnection的速度default : false(不建议使用)
其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来。
三、示例:
示例采用第二种方式:
1.c3p0.properties:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=lovejava
#-------------------------------
#连接池初始化时创建的连接数
c3p0.initialPoolSize=3
#连接池保持的最小连接数
c3p0.minPoolSize=3
#连接池在无空闲连接可用时一次性创建的新数据库连接数,default:3
c3p0.acquireIncrement=3
#连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
c3p0.maxPoolSize=15
#连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒
c3p0.maxIdleTime=100
#连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
c3p0.acquireRetryAttempts=30
#连接池在获得新连接时的间隔时间
c3p0.acquireRetryDelay=1000
2.ConnectionPool
package com.study.
import java.sql.C
import java.sql.SQLE
import javax.sql.DataS
import com.mchange.boPooledDataS
public class ConnectionPool {
private DataS
private static ConnectionP
private ConnectionPool(){
ds = new ComboPooledDataSource();
public static final ConnectionPool getInstance(){
if(pool==null){
pool = new ConnectionPool();
}catch (Exception e) {
e.printStackTrace();
public synchronized final Connection getConnection() {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
3.PoolThread
package com.study.
import java.sql.C
import java.sql.PreparedS
import java.sql.ResultS
import java.sql.SQLE
public class PoolThread extends Thread {
public void run(){
ConnectionPool pool = ConnectionPool.getInstance();
Connection con =
PreparedStatement stmt=
ResultSet rs =
con = pool.getConnection();
stmt = con.prepareStatement("select sysdate as nowtime from dual");
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(Thread.currentThread().getId()+"---------------开始"+rs.getString("nowtime"));
} catch (Exception e) {
e.printStackTrace();
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getId()+"--------结束");
4.PoolMain
package com.study.
public class PoolMain {
* 数据源缓冲池 实例练习
public static void main(String[] args) {
System.out.println("缓冲池模拟开始");
PoolThread[] threads = new PoolThread[50];
for(int i=0;i&threads.i++){
threads[i] = new PoolThread();
for(int i=0;i&threads.i++){
threads[i].start();
浏览 26917
浏览: 129919 次
来自: 上海人气:667503
访问用户量:926
笔记经验:1605
总积分:8618
级别:VIP2
搜索本笔记
ta的交流分类
ta的全部笔记
浏览(11752)|(2)
&&交流分类:|笔记分类:
&c3p0-config& & &default-config& &!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --& &property name=&acquireIncrement&&3&/property& &!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --& &property name=&acquireRetryAttempts&&30&/property& &!--两次连接中间隔时间,单位毫秒。Default: 1000 --& &property name=&acquireRetryDelay&&1000&/property& &!--连接关闭时默认将所有未提交的操作回滚。Default: false --& &property name=&autoCommitOnClose&&false&/property& &!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么 & 属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 & 使用。Default: null--& &property name=&automaticTestTable&&Test&/property& &!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 & 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 & 获取连接失败后该数据源将申明已断开并永久关闭。Default: false--& &property name=&breakAfterAcquireFailure&&false&/property& &!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 & SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --& &property name=&checkoutTimeout&&100&/property& &!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 & Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--& &property name=&connectionTesterClassName&&&/property& &!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 & Default: null--& &property name=&factoryClassLocation&&null&/property& &!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. & (文档原文)作者强烈建议不使用的一个属性--& &property name=&forceIgnoreUnresolvedTransactions&&false&/property& &!--每60秒检查所有连接池中的空闲连接。Default: 0 --& &property name=&idleConnectionTestPeriod&&60&/property& &!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --& &property name=&initialPoolSize&&3&/property& &!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --& &property name=&maxIdleTime&&60&/property& &!--连接池中保留的最大连接数。Default: 15 --& &property name=&maxPoolSize&&15&/property& &!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements & 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 & 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--& &property name=&maxStatements&&100&/property& &!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0& --& &property name=&maxStatementsPerConnection&&&/property& &!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 & 通过多线程实现多个操作同时被执行。Default: 3--& &property name=&numHelperThreads&&3&/property& &!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 & 的数据源时。Default: null--& &property name=&overrideDefaultUser&&root&/property& &!--与overrideDefaultUser参数对应使用的一个参数。Default: null--& &property name=&overrideDefaultPassword&&password&/property& &!--密码。Default: null--& &property name=&password&&&/property& &!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: & 测试的表必须在初始数据源的时候就存在。Default: null--& &property name=&preferredTestQuery&&select id from test where id=1&/property& &!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --& &property name=&propertyCycle&&300&/property& &!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 & 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable & 等方法来提升连接测试的性能。Default: false --& &property name=&testConnectionOnCheckout&&false&/property& &!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --& &property name=&testConnectionOnCheckin&&true&/property& &!--用户名。Default: null--& &property name=&user&&root&/property& &!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数 & 允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始 & 广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到 & 支持,但今后可能的版本可能不支持动态反射代理。Default: false--& &property name=&usesTraditionalReflectiveProxies&&false&/property& &&& &property name=&automaticTestTable&&con_test&/property& &&& &property name=&checkoutTimeout&&30000&/property& &&& &property name=&idleConnectionTestPeriod&&30&/property& &&& &property name=&initialPoolSize&&10&/property& &&& &property name=&maxIdleTime&&30&/property& &&& &property name=&maxPoolSize&&25&/property& &&& &property name=&minPoolSize&&10&/property& &&& &property name=&maxStatements&&0&/property& &&& &user-overrides user=&swaldman&& &&& &/user-overrides& & &/default-config& & &named-config name=&dumbTestConfig&& &&& &property name=&maxStatements&&200&/property& &&& &user-overrides user=&poop&& &&&&& &property name=&maxStatements&&300&/property& &&& &/user-overrides& && &/named-config& &/c3p0-config&
相关笔记推荐
精品视频课程推荐
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识
Hibernate 注解零配置,包括@Id、@Column、@OneToMany等
ORMapping的原理、1+N次问题、版本并发控制、开发的反模式、Open Session In View模式、抓取策略、集合性能、Hibernate运行原理、开发的最佳实践
从零到精通Spring3的开发知识;IoC/DI的思想、IoC/DI的运行流程、IoC/DI的开发指导、AOP的思想、AOP的运行流程、AOP应用的设计、Spring对JDBC和Hibernate的支持、Spring的事务、SSH的集成应用
达到能综合使用Struts2+Spring3+Hibernate3+Jbpm4来进行实际项目开发的能力。
包括:ssh和jbpm的整合;数据字典;通用DAO(Spring+Hibernate+泛型+反射+SpEL+模板方法模式);自动生成UUID的加强版;分层开发、SSH联合的基本开发;翻页的示范真实值和表现值,数据参照的实现;文件上传下载;主子表操;登录验证码;登录控制的拦截器
浏览(11752)|(2)
&&交流分类:|笔记分类:
hadoop veryvery good
版权所有 Copyright(C) 私塾在线学习网后使用快捷导航没有帐号?
查看: 3046|回复: 1
UID帖子阅读权限20精华贴数技术排名243331 专家积分0 社区排名2823828 技术积分6 社区积分0 注册时间
精华贴数专家积分0 技术积分6 社区积分0 注册时间
论坛徽章:0
c3p0的配置方式分为三种,分别是
1.setters一个个地设置各个配置项
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件
1.setters一个个地设置各个配置项
这种方式最繁琐,形式一般是这样:
01Properties props = new Properties();
02InputStream in = ConnectionManager.class.getResourceAsStream(&/c3p0.properties&);
03props.load(in);
04in.close();
06ComboPooledDataSource cpds = new ComboPooledDataSource();
07cpds.setDriverClass(props.getProperty(&driverClass&));
08cpds.setJdbcUrl(props.getProperty(&jdbcUrl&));
09cpds.setUser(props.getProperty(&user&));
10cpds.setPassword(props.getProperty(&password&));
因为繁琐,所以很不适合采用,于是文档提供了另外另种方式。&&2. 类路径下提供一个c3p0.properties文件
文件的命名必须是c3p0.properties,里面配置项的格式为:
1c3p0.driverClass=com.mysql.jdbc.Driver
2c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
3c3p0.user=root
4c3p0.password=java
上面只提供了最基本的配置项,其他配置项参照 配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
1private static ComboPooledDataSource ds = new ComboPooledDataSource();
3public static Connection getConnection() {
4& & try {
5& && &&&return ds.getConnection();
6& & } catch (SQLException e) {
7& && &&&throw new RuntimeException(e);
3.类路径下提供一个c3p0-config.xml文件&&
这种方式使用方式与第二种差不多,但是有更多的优点
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
下面是一个配置模板:
01&c3p0-config&
02&&&default-config&& &
03& & &property name=&user&&root&/property&
04& & &property name=&password&&java&/property&
05& & &property name=&driverClass&&com.mysql.jdbc.Driver&/property&
06& & &property name=&jdbcUrl&&jdbc:mysql://localhost:3306/jdbc&/property&
08& & &property name=&initialPoolSize&&10&/property&
09& & &property name=&maxIdleTime&&30&/property&
10& & &property name=&maxPoolSize&&100&/property&
11& & &property name=&minPoolSize&&10&/property&
12&&&/default-config&
14&&&named-config name=&myApp&&
15& & &property name=&user&&root&/property&
16& & &property name=&password&&java&/property&
17& & &property name=&driverClass&&com.mysql.jdbc.Driver&/property&
18& & &property name=&jdbcUrl&&jdbc:mysql://localhost:3306/jdbc&/property&
20& & &property name=&initialPoolSize&&10&/property&
21& & &property name=&maxIdleTime&&30&/property&
22& & &property name=&maxPoolSize&&100&/property&
23& & &property name=&minPoolSize&&10&/property&
24&&&/named-config&
25&/c3p0-config&
如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了
1private static ComboPooledDataSource ds = new ComboPooledDataSource(&myApp&);
下面整理一下从文档和网上学习到的c3p0配置的理解 (user,password,driverClass,jdbcUrl没有说的必要)
1.基本配置项
01acquireIncrement
02default : 3
03连接池在无空闲连接可用时一次性创建的新数据库连接数
05initialPoolSize
06default : 3
07连接池初始化时创建的连接数
09maxPoolSize
10default : 15
11连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待
12其他连接释放,所以这个值有可能会设计地很大
14maxIdleTime
15default : 0 单位 s
16连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接
17如果为0,则永远不会断开连接
19minPoolSize
20default : 3
21连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载
&&2.管理连接池的大小和连接的生存时间
01maxConnectionAge
02default : 0 单位 s
03配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待
04它close再断开。配置为0的时候则不会对连接的生存时间进行限制。
06maxIdleTimeExcessConnections
07default : 0 单位 s
08这个配置主要是为了减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接
09但是后面的时间段需要的数据库连接数很少,则此时连接池完全没有必要维护那么多的连接,所以有必要将
10断开丢弃掉一些连接来减轻负载,必须小于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize。
11为0则不处理。
maxIdleTime也可以归属到这一类,前面已经写出来了。
3.配置连接测试:因为连接池中的数据库连接很有可能是维持数小时的连接,很有可能因为数据库服务器的问题,网络问题等导致实际连接已经无效,但是连接池里面的连接还是有效的,如果此时获得连接肯定会发生异常,所以有必要通过测试连接来确认连接的有效性。
下面的前三项用来配置如何对连接进行测试,后三项配置对连接进行测试的时机。
01automaticTestTable
02default : null
03用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表,
04并且用自己的测试sql语句在这个空表上测试数据库连接
05这个表只能由c3p0来使用,用户不能操作,同时用户配置的preferredTestQuery 将会被忽略。
07preferredTestQuery
08default : null
09用来配置测试连接的另一种方式。与上面的automaticTestTable二者只能选一。
10如果要用它测试连接,千万不要设为null,否则测试过程会很耗时,同时要保证sql语句中的表在数据库中一定存在。
12connectionTesterClassName
13default :&&com.mchange.v2.c3p0.impl.DefaultConnectionTester
14连接池用来支持automaticTestTable和preferredTestQuery测试的类,必须是全类名,就像默认的那样,
15可以通过实现UnifiedConnectionTester接口或者继承AbstractConnectionTester来定制自己的测试方法
17idleConnectionTestPeriod
18default : 0
19用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它
20保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL
218小时无会话的状态打破。为0则不测试。
23testConnectionOnCheckin
24default : false
25如果为true,则在close的时候测试连接的有效性。为了提高测试性能,可以与idleConnectionTestPeriod搭配使用,
26配置preferredTestQuery或automaticTestTable也可以加快测试速度。
28testConnectionOnCheckout
29default : false
30性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,
31可以与idleConnectionTestPeriod搭配使用,
32配置preferredTestQuery或automaticTestTable也可以加快测试速度。
4.配置PreparedStatement缓存
01maxStatements
02default : 0
03连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以
04这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存,
05同时maxStatementsPerConnection的配置无效。
07maxStatementsPerConnection
08default : 0
09连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为
10它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。
5.重连相关配置
01acquireRetryAttempts
02default : 30
03连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
05acquireRetryDelay
06default : 1000 单位ms
07连接池在获得新连接时的间隔时间
09breakAfterAcquireFailure
10default : false
11如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。
个人觉得上述三个没有更改的必要,但可以将acquireRetryDelay配置地更短一些&&6.定制管理Connection的生命周期
1connectionCustomizerClassName
2default : null
3用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在
4Connection丢弃的时候进行资源关闭,就可以通过继承一个AbstractConnectionCustomizer来实现相关
5方法,配置的时候使用全类名。有点类似监听器的作用。
01import java.sql.C
02import com.mchange.v2.c3p0.AbstractConnectionC
04public class ConnectionCustomizer extends AbstractConnectionCustomizer{
06& & @Override
07& & public void onAcquire(Connection c, String parentDataSourceIdentityToken)
08& && && && &throws Exception {
09& && &&&System.out.println(&acquire : & + c);
11& & @Override
12& & public void onCheckIn(Connection c, String parentDataSourceIdentityToken)
13& && && && &throws Exception {
14& && &&&System.out.println(&checkin : & + c);
16& & @Override
17& & public void onCheckOut(Connection c, String parentDataSourceIdentityToken)
18& && && && &throws Exception {
19& && &&&System.out.println(&checkout : & + c);
21& & @Override
22& & public void onDestroy(Connection c, String parentDataSourceIdentityToken)
23& && && && &throws Exception {
24& && &&&System.out.println(&destroy : & + c);
1&property name=&connectionCustomizerClassName&&liuyun.zhuge.db.ConnectionCustomizer&/property&
7.配置未提交的事务处理
1autoCommitOnClose
2default : false
3连接池在回收数据库连接时是否自动提交事务
4如果为false,则会回滚未提交的事务
5如果为true,则会自动提交事务
7forceIgnoreUnresolvedTransactions
8default : false
9这个配置强烈不建议为true。
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?&&8.配置debug和回收Connection
01unreturnedConnectionTimeout
02default : 0 单位 s
03为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收
04Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭
05情况的不是很适用。为0不对connection进行回收,即使它并没有关闭。
07debugUnreturnedConnectionStackTraces
08default : false
09如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接
10unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为
11打印堆栈信息会减慢getConnection的速度
同第七项一样的,连接用完当然得close了,不要通过unreturnedConnectionTimeout让连接池来回收未关闭的连接。&&9.其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来
1checkoutTimeout
2default : 0
3配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放
4或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException
UID71047帖子阅读权限100精华贴数技术排名1 专家积分837 社区排名4 技术积分261281 社区积分121699 注册时间
天王盖地虎
精华贴数专家积分837 技术积分261281 社区积分121699 注册时间
论坛徽章:336
-----孰能浊以静之徐清&&孰能安以动之徐生-----&&
----------------
Karaf+Aries+blueprint 研究中...
Open Stack/Docker 研究中...
OpenDayLight/NFV 研究中...
OPENCL + Spark+ Hadoop 研究中...
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号}

我要回帖

更多关于 jpa 数据库连接池 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信