1

この例外は、アプリケーションを数日間実行した後のコードの一部のデータベース更新でのみ発生します。渡された要求の一部と、それらの一部(同じ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>

常に利用可能な接続があります。どうすれば修正できますか?ありがとう。

4

4 に答える 4

1

You surely have prepared statements that are not being closed properly. A memory dump should help you find those.

于 2011-02-16T23:14:53.140 に答える
1

これは、おそらくリソースを適切に閉じていないことを意味します。それらを作成するメソッドのスコープ内の finally ブロックでそれを行う必要があります。

于 2010-08-05T15:52:17.217 に答える
0

設定ファイルで以下を試してください:

db.pool.statements.enable=false
于 2014-04-29T05:49:16.980 に答える
0

負の値を設定できます。負の値を設定すると、開いている準備済みステートメントが無制限にキャッシュに作成されます。

于 2019-09-04T16:47:16.410 に答える