数据库连接问题,挂了20个线程跑数据库只剩下了一个...

请问我用多线程(20个)去数据库存储操作,每个线程循环50次(逻辑如此),跑了一段时间后只剩下一个线程,其他都挂了, 请问是什么原因呢,   

com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.jfinal.plugin.activerecord.Model.save(Model.java:413)
at com.tools.upyun.UpYunTools$1.run(UpYunTools.java:123)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at com.jfinal.plugin.activerecord.Config.getConnection(Config.java:161)
at com.jfinal.plugin.activerecord.Model.save(Model.java:401)
... 2 more
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
... 5 more
数据库最大连接100



评论区

clatt

2016-12-01 17:10

会不会是jfinal在处理的存储的时候连接没有关掉?

JFinal

2016-12-01 17:23

jfinal 在所有操作数据库的地方都用了 finally { conn.close(); } 确保连接被关闭,所以只要是直接使用 jfinal API 操作数据库,都确保了连接关闭

连接可能未被关闭的情况是开发者自行获取 Connection 的情况,例如:
DbKit.getConfig().getConnection() 或者
DbKit.getConfig().getDataSource().getConnection()

上述两类代码,开发者需要自行处理 connection 的关闭,建议一定要在 finally 块之中去关闭

至于贴子中出现的问题,除了上述用户自行去拿 connection 没关的情况,还有一种情况是连接获取的速度快于连接回收的速度,造成连接很快被耗尽的情况,调整下连接池大小,以及程序即可

clatt

2016-12-01 17:46

@JFinal 谢谢:-),是连接池的问题, 阿里的rds最大连接数是60个

潇洒太爷

2016-12-03 23:17

@JFinal 波总,关于DbKit.getConfig().getConnection(),如果我是用Tx.class,然后用try catch,手动 DbKit.getConfig().getConnection().rollBack()。。没有用finally块去close,这样会造成连接未关闭的问题么?

JFinal

2016-12-04 00:05

@潇洒太爷 单步调一下,如果 DbKit.getConfig().getConnection() 得到的 connection 对象仍处于 jfinal 的 Tx 管理之下,也不会有问题,关键点在于这个 connection 是不是 jfinal 最先获取并放入 threadlocal 之中的,如果是的话,没有问题

建议所有自行获取 connection 的地方都用 finally{} 块来关闭,不要心存侥幸

热门反馈

扫码入社