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
小结:
很不好啊!
+
+
=
=
=
=