2017-01-10 3 views
0

Ich verwende Tomcat 8.0.29 und verwende den von Tomcat bereitgestellten JDBC-Pool, der mit der JNDI-Ressource initialisiert wurde. Ich verbinde mich mit einer Postgres-Datenbank und verwende den JDBC-Treiber, der mit 9.4 veröffentlicht wurde. Alles funktioniert gut und ich bin in der Lage, Abfragen zu verbinden und auszuführen.Tomcat JDBC-Pool-Messwerte

Ich möchte Metriken über den Verbindungspool aus meinem Java-Programm sammeln. Zum Beispiel würde ich gerne wissen, wie viele inaktive Verbindungen ich derzeit habe und/oder wie viele Verbindungen aus dem Pool verwendet werden. Ich habe versucht, den Protokollierungsgrad zu erhöhen, und das hat mir keine dieser Pool-Metriken gegeben. Ich habe versucht, JMX zu betrachten, und ich sehe keine MBeans, die diese Informationen haben. Ich habe einige andere Posts gesehen, die behaupteten, dass ich MBeans verwenden könnte, aber die Version, die ich ausführe, hat diese MBeans nicht.

Ich habe ziemlich viel gesucht und kann keine Antwort auf diese einfache Frage finden. Ich möchte im Grunde nur Daten protokollieren oder abfragen, die sich auf den JDBC-Pool innerhalb von Tomcat beziehen.

Antwort

0

So mache ich das, aber Ich habe es in Tomcat 7 getestet, aber noch nicht in Tomcat 8.

Zuerst müssen Sie Zugriff auf javax.sql.DataSource Objekt erhalten. Es sollte nicht schwierig sein, wenn Sie SQL ausführen können. Sobald Sie die Datasource-Objektreferenz haben, sollte es zu org.apache.tomcat.dbcp.dbcp.BasicDataSource Gießen können Sie die Messwerte erhalten Sie suchen:

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

Ich habe gerade versucht, dies in 8. Es gibt keine org.apache.tomcat.dbcp.dbcp.BasicDataSource, aber es gibt einen Paketnamen zu org.apache.tomcat.dbcp.dbcp2.BasicDataSource. Ich habe das stattdessen verwendet und alles ordnungsgemäß kompiliert, jedoch habe ich zur Laufzeit den folgenden Fehler erhalten: "SEVERE: org.apache.tomcat.jdbc.pool.DataSource kann nicht in org.apache.tomcat.dbcp.dbcp2.BasicDataSource umgewandelt werden". Ich habe etwas anderes gemacht, aber es war mehr involviert. Ich werde meine Frage aktualisieren. – user1442883

0

landete ich dieses Problem lösen, indem Sie eine benutzerdefinierte JDBCInterceptor zu schaffen. Mein Abfangjäger war sehr einfach:

Ich exportierte dies in ein JAR und legte es in mein tomcat/lib-Verzeichnis. Ich habe auch meine JNDI-Datenquelle context.xml aktualisiert, um meinen neuen Interceptor einzuschließen.

<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**"/> 

Als ich Tomcat neu startete, druckte meine Konsole Verbindungsmetriken, nach denen ich suchte.

Hoffe das hilft jemand anderem.

Verwandte Themen