Исключение пула соединений: не удается получить соединение, тайм-аут ошибки пула, ожидающий бездействующего объекта
Я запускаю веб-приложение в производстве, которое недавно разбилось после того, как оно было под некоторым стрессом. Я бы предположил, что 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
Я считаю, что это напрямую связано с некоторым кодом, который я недавно добавил в свой проект Grails, который влияет на пул соединений (хотя я считаю, что это не конкретный grails проблема):
maxActive = 50
maxIdle = 15
minIdle = 5
initialSize = 15
minEvictableIdleTimeMillis = 180000
timeBetweenEvictionRunsMillis = 180000
maxWait = 10000
validationQuery = "/* ping */"
что я делаю не так? Пожалуйста, помогите! Спасибо.
2 ответов
измените соответствующие части на:
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
Это, вероятно, должно решить эту проблему.
У меня был плохой код, который поддерживал связи дольше, чем они должны были быть. Как только я исправил основную проблему, это ушло.