Достигнут предел MaxOpenPreparedStatements - PullRequest
1 голос
/ 05 августа 2010

Я получаю это исключение только для НЕКОТОРЫХ обновлений базы в моем коде после нескольких дней работы приложения. Некоторые запросы пройдены, а некоторые (тот же код 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>

Всегда доступны соединения. Как я могу это исправить? Спасибо.

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Вы наверняка подготовили заявления, которые не закрываются должным образом.Дамп памяти должен помочь вам найти их.

1 голос
/ 05 августа 2010

Это означает, что вы, вероятно, неправильно закрываете ресурсы.Вы должны делать это в блоке finally в рамках метода, в котором вы их создаете.

0 голосов
/ 29 апреля 2014

Пожалуйста, попробуйте ниже в вашем файле конфигурации:

db.pool.statements.enable=false
...