2010-08-05 4 views
1

며칠 동안 응용 프로그램을 실행 한 후 코드에서 일부 데이터베이스 업데이트에 대해서만 예외가 발생합니다. 전달 된 요청 중 일부 및 일부 (동일한 Java 코드)가 실패합니다.MaxOpenPreparedStatements 한도에 도달했습니다.

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> 

가에 allways 사용할 수있는 연결이 있습니다. 어떻게 해결할 수 있습니까? 감사.

답변

1

이것은 리소스를 제대로 닫지 않았 음을 의미합니다. finally 블록에서 작성한 메소드의 범위 내에서 수행해야합니다.

1

확실하게 닫히지 않은 명령문을 준비해야합니다. 메모리 덤프를 사용하면 이러한 정보를 찾을 수 있습니다.

0

구성 파일에 다음 시도하십시오 :

db.pool.statements.enable=false 
관련 문제