2017-01-10 6 views
0

Tomcat 8.0.29를 실행 중이고 JNDI 리소스를 사용하여 초기화 된 Tomcat 제공 JDBC 풀을 사용하고 있습니다. Postgres 데이터베이스에 연결하고 9.4와 함께 릴리스 된 JDBC 드라이버를 사용하고 있습니다. 모든 것이 잘 작동하고 쿼리를 연결하고 실행할 수 있습니다.Tomcat JDBC 풀 메트릭

내 Java 프로그램 내에서 연결 풀에 대한 메트릭을 수집하고 싶습니다. 예를 들어, 내가 현재 갖고있는 유휴 연결 수 및/또는 풀에서 얼마나 많은 연결이 사용되고 있는지 알고 싶습니다. 로깅 수준을 높이려고 시도했지만 저에게 이러한 풀 메트릭을 제공하지 않았습니다. JMX를 살펴 보았는데이 정보가있는 MBeans이 보이지 않습니다. MBeans를 사용할 수 있다고 주장하는 다른 게시물을 보았습니다.하지만 실행중인 버전에는 해당 MBean이 없습니다.

나는 꽤 많은 수색을했으며이 간단한 질문에 대한 답을 찾을 수 없다. 기본적으로 Tomcat에서 JDBC 풀과 관련된 메트릭을 로깅하거나 쿼리 할 수 ​​있기를 원합니다.

답변

0

이것은 내가하는 방법이지만 Tomcat 7에서는 테스트했지만 아직 Tomcat 8에서는 테스트하지 않았습니다..

먼저 javax.sql.DataSource 개체에 액세스해야합니다. SQL을 실행할 수 있다면 어렵지 않습니다. 당신이 org.apache.tomcat.dbcp.dbcp.BasicDataSource에 캐스팅, 데이터 소스 객체 참조를 일단 당신이 당신이 찾고있는 통계를 얻을 수 있도록해야합니다

public double testDsUsagePercentage(javax.sql.DataSource ds){ 
    org.apache.tomcat.dbcp.dbcp.BasicDataSource basic = (org.apache.tomcat.dbcp.dbcp.BasicDataSource)ds; 
    int total = basic.getMaxActive(); 
    int idle = basic.getNumIdle(); 
    int active = basic.getNumActive(); 
    double percentage = this.calcUsagePercent(total, active + idle); 
    return percentage; 
} 

/** 
* 
* @param max 
* @param used 
* @return 
*/ 
private double calcUsagePercent(int max, int used){ 
    if(max == 0){ 
     return 0.0; 
    } 
    return ((double)used/(double)max)*100; 
} 
+0

저는 이것을 8에서 시도했습니다. org.apache.tomcat.dbcp.dbcp.BasicDataSource는 없지만 org.apache.tomcat.dbcp.dbcp2.BasicDataSource에 대한 패키지 이름이 있습니다. 그 대신에 모든 것을 올바르게 컴파일했지만, 런타임 중에 다음과 같은 오류가 발생했습니다 : "심각 : org.apache.tomcat.jdbc.pool.DataSource를 org.apache.tomcat.dbcp.dbcp2.BasicDataSource로 캐스팅 할 수 없습니다". 나는 다른 것을하는 것을 끝내었다. 그러나 그것은 더 복잡하게하게되었다. 나는 내 질문을 업데이트 할 것이다. – user1442883

0

나는 정의 JDBCInterceptor를 만들어이 문제를 해결 끝났다. 저의 인터셉터는 매우 간단했습니다 :

이것을 JAR 파일로 내 보낸 다음 tomcat/lib 디렉토리에 저장했습니다. 또한 새 인터셉터를 포함하도록 context.xml JNDI 데이터 소스를 업데이트했습니다.

<Resource name="jdbc/postgres" auth="Container" 
......jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; 
       org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; **org.mayan.tomcat.jdbc.pool.interceptor.MetricsInterceptor**"/> 

Tomcat을 다시 시작하면 콘솔에서 찾고 있던 연결 메트릭을 인쇄하고있었습니다.

다른 사람에게 도움이되기를 바랍니다.