谁来拯救C3P0的致命伤

 

c3p0问题多多,怪不得要淘汰了。

 

 

# 连接池大了,管理就出问题。

c3p0连接错误 An attempt by a client to checkout a Connection has timed out.

c3p0作为连接池,报:java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 
网上查了很久,有人说是checkoutTimeout太短的原因,(Default: 0)于是由原来的1000改为2000,问题还是未解决。 
然后找了份没有问题的配置作了些对比,发现我的maxPoolSize=100显得有些大,于是改为默认的15.再测试,居然没有问题了。后来再试了大一点的60,也没有问题。

dataSource.setMaxPoolSize(30); // 连接池中保留的最大链接数,默认是15
我的是30就报这个问题了。。。不晓得什么原因。。。
我用loadrunner跑了下。。20个用户,跑了三分钟之后,再次登录系统就这个错误

 

# 长时间不进行数据库操作,Connection会断开

程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开。其原因有可能是防火墙,或者连接的数据库设置的超时时间。这里使用的是 C3P0 连接 oracle 数据库,引起的异常信息为:

异常抛出的地方为 Spring 的事务管理 transactionManager,而并非程序代码。即便捕捉到异常,使用 sessionFactory.openSession 也会抛出如下异常:

这个解决方法应该不行的:java.sql.SQLException: 关闭的连接 解决办

 

# 连接超时Connection has timed out.

java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

解决办法:

** 是Spring中配置c3p0的时候,有一个配置属性是checkoutTimeout,把这个配置属性去掉就正常了。(fantaxy备注:这个不行的)

参考这里:【c3p0】 java.sql.SQLException: An attempt by a client to checkout a Connection...

** 配置maxIdleTime

参考这里:Mysql Broken pipe问题的解决办法。

这个方法貌似也不行,虽然写的原理很清楚也很不错。

这个是由于msyql的wait_timeout的设置, 如果在一定时间内mysql的connection没有使用的话mysql server会关闭掉connection的socket。 具体解决办法可以看参考我的这篇文章 
http://dengyin2000.iteye.com/blog/417730

 

# c3p0 You can’t operate on a closed Connection解决办法

没有做任何关闭操作, 使用 createstatement,

maxStatements=10 难道是这个配小了

connection关闭了之后执行createStatement导致的。

根据我们做过大规模测试的结果,稳定的开源数据库连接池只有jboss-datasource和druid。

推荐使用阿里巴巴开源的数据库连接池Druid。性能比BoneCP好,功能更齐全,经过大规模的部署,更稳定。https://github.com/AlibabaTech/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

参考这里:http://www.oschina.net/question/220489_80358

 

解决方法:

c3p0连接池,You can't operate on a closed Connection [问题点数:40分,结帖人ypfei2008]

我是本机测试的,connection.close就会出这个错
删掉connection.close就不会
在数据库那边show processlist发现c3p0正常工作的,一开始有初始化配置的connection

 

小结:

很不好啊!

 

 

+

+

=

=

=
=

你可能感兴趣的:(c3p0)