복붙노트

[SPRING] Tomcat에 배포 된 DBCP의 교착 상태 문제

SPRING

Tomcat에 배포 된 DBCP의 교착 상태 문제

데이터베이스 연결을 관리하기 위해 스프링 구성에서 DBCP 데이터 소스 (기본 구성 사용)를 사용하고 있으며 클라이언트 수가 증가하면 교착 상태가 발생합니다.

DBCP 1.2.1에서 교착 상태 문제가 있음을 발견했습니다.이 문제는 1.4에서 해결 될 예정이었습니다. 그래서 1.4로 업그레이드했지만 문제는 여전히 지속됩니다.

스레드 덤프에는 다음 스택 추적으로 차단 된 많은 스레드가 맨 위에 있습니다.

   java.lang.Thread.State: WAITING on org.apache.commons.pool.impl.GenericObjectPool$Latch@b6b09e
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:200)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:261)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631)

어떤 제안이라도 환영합니다!

해결법

  1. ==============================

    1.몇 년 전 c3p0로 전환했습니다. 너는 그것을 시도 할 수있다. 나는 당신이 많이 바꿀 필요가 없다고 믿습니다. 그것은 구성의 게임 일뿐입니다.

    몇 년 전 c3p0로 전환했습니다. 너는 그것을 시도 할 수있다. 나는 당신이 많이 바꿀 필요가 없다고 믿습니다. 그것은 구성의 게임 일뿐입니다.

    다소 관련 스레드, JDBC를 사용한 연결 풀링 옵션 : DBCP 대 C3P0. 글쎄, 사실 나는 그것을 관련되게 만들었다.

    [편집 됨, 19/10/12]

    Tomcat 7에는 알맞은 연결 풀인 Tomcat JDBC 연결 풀이 있습니다.

  2. ==============================

    2.commons-pool 버전이 dbcp 버전과 일치하는지 확인 했습니까?

    commons-pool 버전이 dbcp 버전과 일치하는지 확인 했습니까?

    또한 stacktrace에서 교착 상태가 보이지 않고 있습니다. 연결을 기다리는 스레드가있는 것처럼 보입니다. 얼마나 많은 스레드를 동시에 연결하려고합니까? 수영장 등을 위해 몇 개의 연결을 구성 했습니까?

    이런 종류의 경우를 디버깅 할 때 연결을 얻은 스레드가 수행중인 작업을 살펴 ​​보는 것도 유용합니다.

  3. ==============================

    3.동시 접속에 대한 요구가 증가하고 있습니다. 스레드가 borrowConnection ()에 매달려 있기 때문에 충분한 액티브 연결을 사용할 수 없다는 것을 의미합니다.

    동시 접속에 대한 요구가 증가하고 있습니다. 스레드가 borrowConnection ()에 매달려 있기 때문에 충분한 액티브 연결을 사용할 수 없다는 것을 의미합니다.

    Incrkease maxActive 데이터 원본 속성 및 600ms - 1000ms 같은 시간 WHEN_EXHAUSTED_BLOCK 설정하십시오. 600ms -1000 ms 경과 후에 만 ​​사용 가능한 요소 없음 예외가 발생합니다.

  4. ==============================

    4.이 문제는 앱 코드에서 연결을 닫지 않아서 발생했기 때문에 풀에서 연결이 끊어져 버린 것 같습니다. 어쩌면 당신은 DBCP에서 "removeAbandoned"속성을 설정하려고합니다. 이것은 http://commons.apache.org/dbcp/configuration.html에 문서화되어 있습니다.

    이 문제는 앱 코드에서 연결을 닫지 않아서 발생했기 때문에 풀에서 연결이 끊어져 버린 것 같습니다. 어쩌면 당신은 DBCP에서 "removeAbandoned"속성을 설정하려고합니다. 이것은 http://commons.apache.org/dbcp/configuration.html에 문서화되어 있습니다.

    행운을 빕니다!

  5. ==============================

    5.나는 비슷한 문제에 직면하고 있었고 다음 단계에 따라 해결되었습니다.

    나는 비슷한 문제에 직면하고 있었고 다음 단계에 따라 해결되었습니다.

    다른 드라이버는 다르게 구현됩니다. 기본 resultSet이 닫히지 않으면 일부 드라이버는 여전히 연결에 손을 대게됩니다.

    dataSource.setDefaultAutoCommit (true);             dataSource.setMaxActive (700); // db 서버에 800이 있는지 확인하십시오.             dataSource.setRemoveAbandoned (true);             dataSource.setTestOnBorrow (true);             dataSource.setLogAbandoned (true);             dataSource.setTestWhileIdle (true);             dataSource.setTestOnReturn (true);             dataSource.setRemoveAbandonedTimeout (60);

    dbcp가 x 개의 새로운 연결을 먼저 제공 한 다음 setMaxActive를 초과하는 연결을 정리하려고 시도 할 때 데이터베이스 서버가 setMaxActive에 지정된 수보다 많은 at least 50+ 연결을 허용 할 수 있는지 확인하십시오. 클린업 dbcp는 서버 로그 / 콘솔에서 모든 연결이 닫히지 않았 음을 보여줍니다.

  6. from https://stackoverflow.com/questions/5714511/deadlock-issue-in-dbcp-deployed-on-tomcat by cc-by-sa and MIT license