2014-10-24 1 views
3

나는 MySQL 데이터베이스에 연결하는 grails로 빌드 된 webservice를 가지고있다.grails로 연결 풀 상태 얻기

org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-bio-8080-exec-216] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:50; busy:50; idle:0; lastwait:30000] 

를이 내 Datasources.groovy

내가 읽은
dataSource { 
    url = "jdbc:mysql://..." 
    username = "xxx" 
    password = "xxx" 
    pooled = true 
    properties { 
     maxActive = 50 
     maxAge = 10 * 60000 
     timeBetweenEvictionRunsMillis = 5000 
     minEvictableIdleTimeMillis = 60000 
     numTestsPerEvictionRun=3 
     testOnBorrow=true 
     testWhileIdle=true 
     testOnReturn=true 
     validationQuery="SELECT 1" 
    } 
} 
dataSource_survey { 
    url = "jdbc:mysql://..." 
    username = "xxx" 
    password = "xxx" 

    pooled = true 
    properties { 
     maxActive = 50 
     maxAge = 10 * 60000 
     timeBetweenEvictionRunsMillis = 5000 
     minEvictableIdleTimeMillis = 60000 
     numTestsPerEvictionRun=3 
     testOnBorrow=true 
     testWhileIdle=true 
     testOnReturn=true 
     validationQuery="SELECT 1" 
    } 
} 

Grails가있다 : 내가 2.4.3로 업그레이드 이후 나는 connectionpool 예외의 결과로, 연결을 해제하지 문제를 했어 JIRA와 어떤 사람들은 비슷한 문제가있는 것 같습니다. 그러나 나는 거기에 제공된 정보로 그것을 고칠 수 없었다.

연결 풀의 상태에 액세스하면 많은 디버깅에 도움이됩니다. 연결 풀의 상태를 확인하여 런타임 중에 얼마나 많은 연결이 유휴/통화 중 상태인지 확인할 수 있습니까?

+0

Grails Melody 플러그인을 살펴 보는 것이 좋습니다. http://grails.org/plugin/grails-melody이 정보와 그 밖의 정보가 있습니다. –

+0

@JoshuaMoore 유용하게 보입니다. 팁 고마워. – ascu

답변

5

연결 풀은 javax.sql.DataSource으로 등록되지만 해당 인터페이스는 Connection (사용자 이름/암호가없는 사용자)과 로그 기록기에 액세스하고 로그인 시간 초과를 가져 오거나 설정하는 방법 만 있습니다. 그 밖의 모든 사항은 공급 업체가 결정할 수 있도록 남겨두고, 처음에는 풀을 구성하고 앱을 실행하는 동안 풀로 작업하고 모니터링하는 방법에있어 공급 업체간에 공통점이 거의 없습니다.

그래서 풀에 사용되는 라이브러리를 찾아 API를 사용해야합니다. 이상적으로는 dataSource 빈에 액세스하는 것만 큼 간단합니다. 클래스/필드 (이 경우는 def dataSource)와 같은 서비스/컨트롤러/etc로 종속성을 주입하고 클래스 이름을 인쇄하면됩니다. 하지만 몇 가지 중요한 행동을 추가하기 위해 몇 가지 프록시를 사용하여 데이터 소스를 래핑하므로 액세스하기가 쉽지 않습니다.

여러분은 운이 좋았습니다.이 경우에는 원래 비 승인 인스턴스를 그대로두고 dataSourceUnproxied bean 당신은 dependency-inject도 할 수있다. (단지 어떤 연결도 접근하지 않고 오직 정보에만 접근한다.)

오랜 시간 동안 우리는 데이터 소스를 관리하기 위해 commons-pool을 사용했지만, 벤치 마크 테스트에서 C3P0를 포함하여 다른 어떤 것보다 빠르다는 것을 보여 주었기 때문에 () 커먼즈 - 풀 (pool)에 있었기 때문에, 기본 성능 향상과보다 많은 구성 가능성을 갖춘 기본 대체품이었습니다.

+0

어떻게 대답합니까? 무엇이 변경되었거나 모니터링 되었습니까? –

+0

@ MichaelJ.Lee 그는 사용중인 데이터베이스에 따라 크게 달라지는 풀의 상태에 액세스하는 방법을 설명합니다. 그는 불행히도 복사 붙여 넣기 준비 코드를 제공하지 않습니다. 그러나 그의 설명 덕분에'ctx.getBean ('dataSourceUnproxied'). getActive()'를 실행하여 상태를 얻을 수있었습니다. –