26. September 2007

DBCP-Logging in Tomcat

Beim Tomcat kann man wie folgt Connection-Pooling über DBCP einrichten. Dabei ist es möglich
Connections, die nicht mehr geschlossen werden nach einer bestimmten Zeit zu schließen (removeAbandoned). Zusätzlich kann ein Stacktrace der Codestelle geloggt werden, die das Problem verursacht hat (logAbandoned)

<Resource name="jdbc/MyDB2"
scope="Shareable"
type="javax.sql.DataSource"
auth="Container"
url="jdbc:db2:mydb2"
maxIdle="10"
maxOpenPreparedStatements="50"
maxActive="50"
validationQuery="Select name from test FETCH FIRST 1 ROWS ONLY FOR FETCH ONLY"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="600000"
driverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
maxWait="10000"
username="user"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
poolPreparedStatements="true"
password="pass"
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true"
/>

Das Problem mit DBCP ist, dass diese Logausgabe über System.out rausgeschrieben werden und nicht über ein Logging-Framework. Daher muss beim Starten des Tomcats dessen Ausgabe einfach in eine File geschrieben werden:


bin\catalina run >logs_tomcat\console-out-%date%.log


Erzeugt z.B. folgende Ausgabe:

DBCP object created 2007-09-26 12:03:40 by the following code was never closed:
java.lang.Exception
at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:157)
at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:76)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at de.rfeest.test.db.ConnectionOpenerJNDIImpl.createConnection(Unknown Source)
at de.rfeest.test.db.Executor.openConnection(Unknown Source)

Keine Kommentare: