Hibernate 连接池异常:无法获取连接,池错误等待空闲对象超时

Hibernate 连接池异常:无法获取连接,池错误等待空闲对象超时,hibernate,exception,tomcat,grails,apache-commons-dbcp,Hibernate,Exception,Tomcat,Grails,Apache Commons Dbcp,我正在生产中运行一个web应用程序,该应用程序最近因压力过大而崩溃。我猜有100-300人在类似的时间访问该网站,我希望这会很好 崩溃前后的日志如下: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:render>: Hibernate operation: could not inspect JDBC autocommit mode; uncate

我正在生产中运行一个web应用程序,该应用程序最近因压力过大而崩溃。我猜有100-300人在类似的时间访问该网站,我希望这会很好

崩溃前后的日志如下:

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:render>: Hibernate operation: could not inspect JDBC autocommit mode; uncategorize\
d SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.commons.db\
cp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object at /WEB-INF/grails-app/views/layouts/file.gsp:37
        at gsp_file_gsp$_run_closure2.doCall(file_gsp.groovy:43)
        at gsp_file_gsp$_run_closure2.doCall(file_gsp.groovy)
        at gsp_file_gsp.run(gsp_file_gsp.groovy:48)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not inspect JDBC autocommit mode; uncategorized SQLException for SQL [???]; SQL stat\
e [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a co\
nnection, pool error Timeout waiting for idle object
        at User.find(User.groovy:68)
        at User$find.call(Unknown Source)
        at gsp_pps_file_gsp.run(gsp_file_gsp.groovy:22)
        ... 9 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at $Proxy7.getAutoCommit(Unknown Source)
        ... 12 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1144)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
        ... 14 more

我做错了什么?请帮忙!谢谢。

将相关部分更改为:

minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"

这可能会解决这个问题。

我有一段糟糕的代码,它让连接比应该的时间更长。一旦我解决了根本问题,它就消失了。

我的maxWait是否过低?我正在阅读文档,这可能是问题所在,但我不能说我对此有信心在MySQL中,我只从Apache服务器获得8个连接。这是否意味着这段代码根本不起作用?如果我没记错的话,您最初的问题是,由于MySQL超时,您的池中有一堆死连接。您是否尝试设置验证字符串并保持其他所有内容不变?是否解决了此问题?你能分享这个解决方案吗?检查你是否有任何连接泄漏。查看您的代码您是如何追踪违规代码的?我看到同样的问题,只存在于生产。我们最近添加了一个新功能,当我关闭它时,问题就消失了。这段新代码没有直接管理DB连接,所以我不确定它是如何保持连接打开的。我唯一能说的是,新代码是在DB触发器方法中执行的。……afterInsert()在我的一些域类中。@ShatyUT您可以始终使用VisualVM之类的探查器(带有适当的插件)跟踪您的连接,这样您就可以在运行时看到您的连接被打开,而在特定操作中无法关闭。谢谢!这对于web应用程序来说是最优的吗?这是在MySQL上测试的吗?这最初是针对MySQL的,现在我对PostgreSQL使用相同的配置。
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"