在应用程序运行几天后,我的代码中的某些数据库更新才会出现此异常。一些请求通过,其中一些(相同的java代码)失败。
java.sql.SQLException: MaxOpenPreparedStatements limit reached
at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:109)
at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
at com.prog.C.f(C.java:967)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.util.NoSuchElementException
at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:808)
at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:107)
... 15 more
数据源配置:
<bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" lazy-init="true" scope="singleton">
<property name="driverClassName" value="${jdbc.driver.class}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
</bean>
总有可用的连接。我该如何解决?感谢。
答案 0 :(得分:1)
这意味着您可能没有正确关闭资源。您应该在您创建它们的方法范围内的finally块中执行此操作。
答案 1 :(得分:1)
您肯定已准备好未正确关闭的语句。内存转储应该可以帮助您找到它们。
答案 2 :(得分:0)
请在配置文件中尝试以下内容:
db.pool.statements.enable=false
答案 3 :(得分:0)
您可以设置负值。设置负值会在缓存中创建无限的打开的准备好的语句。