Description:
Using Tomcat 5.0.28 and configuring a data source with DBCP pool in server.xml
When I add the properties gatherPerfMetrics=true and reportMetricsIntervalMillis=30000 to the connection properties with a validation query "select 1", it results in an NullPointerException when the pool try to initialize (during execution of the the validation query).
Here is the interesting part of the stack trace :
----- Root Cause -----
javax.servlet.ServletException: com._1genia.rnd.annuaire.persistence.PersistenceException: net.sf.hibernate.JDBCException: Cannot open connection: Cannot create PoolableConnectionFactory (Error during query: Unexpected Exception: java.lang.NullPointerException message given: null
Nested Stack Trace:
** BEGIN NESTED EXCEPTION **
java.lang.NullPointerException
STACKTRACE:
java.lang.NullPointerException
at com.mysql.jdbc.ResultSet.<init>(ResultSet.java:366)
at com.mysql.jdbc.MysqlIO.buildResultSetWithRows(MysqlIO.java:1980)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:429)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1384)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1727)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:822)
at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:205)
at org.apache.commons.dbcp.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:328)
at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:879)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at net.sf.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:61)
at net.sf.hibernate.impl.SessionFactoryImpl.openConnection(SessionFactoryImpl.java:417)
at net.sf.hibernate.impl.SessionImpl.connection(SessionImpl.java:2861)
at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:55)
at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:480)
at net.sf.hibernate.loader.Loader.doFind(Loader.java:136)
at net.sf.hibernate.loader.Loader.find(Loader.java:606)
at net.sf.hibernate.hql.QueryTranslator.find(QueryTranslator.java:912)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1356)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1335)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1327)
How to repeat:
Configure a data source with Tomcat, here is mine :
<Resource name="jdbc/testdb" auth="Container" type="javax.sql.DataSource" />
<ResourceParams name="jdbc/testdb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>50</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/test</value>
</parameter>
<parameter>
<name>connectionProperties</name>
<value>autoReconnect=true;relaxAutoCommit=true;logSlowQueries=true;slowQueryThresholdMillis=2000;gatherPerfMetrics=true;reportMetricsIntervalMillis=30000
</value>
</parameter>
<parameter>
<name>validationQuery</name>
<value>select 1</value>
</parameter>
<parameter>
<name>minEvictableIdleTimeMillis</name>
<value>1200000</value>
</parameter>
<parameter>
<name>timeBetweenEvictionRunsMillis</name>
<value>300000</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
</ResourceParams>