javatomcatjdbcconnection-pooling

Tomcat validates connection on every borrow


I am using Tomcat 7 (jdk 1.6) in Eclipse 4.3.2.

I configured my Connection Pool as below :

<Resource name="jdbc/myDS"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="com.p6spy.engine.spy.P6SpyDriver"
          url="jdbc:p6spy:oracle:thin:@server:1521:XXX"
          username="XXX"
          password="XXX"
          maxActive="2"
          maxIdle="2"
          maxWait="-1"
          validationInterval="30000"
          validationQuery="SELECT 1 FROM DUAL"
/>

I am using Spring 3.2.14, Hibernate 3.2.6-GA, CXF 2.7.

Every time I receive a SOAP request, I see in P6SPY logs that the validation query is run independently of validationInterval and its description https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html.

I was expecting the connections to be validated at most once every 30 seconds.

Is there anything wrong with my configuration, or is this a known bug ?


Solution

  • The explanation is pretty simple, I did not read correctly the documentation, I need to set the factory to org.apache.tomcat.jdbc.pool.DataSourceFactory in order to use the "Tomcat High-concurrency connection pool".

    After that all parameters work as expected :

    <Resource 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      name="jdbc/myDS" auth="Container" type="javax.sql.DataSource" 
      driverClassName="com.p6spy.engine.spy.P6SpyDriver"
      url="jdbc:p6spy:oracle:thin:@server:1521:XXX"
      username="XXX" password="XXX" maxActive="2" maxIdle="2" maxWait="-1"
      testOnBorrow="true"
      testWhileIdle="true"
      timeBetweenEvictionRunsMillis="10000"
      validationInterval="30000" 
      validationQuery="SELECT 1 FROM DUAL"
    />
    

    The connections are validated at most every validationInterval. An evictionThread runs every timeBetweenEvictionRunsMillis and validates idle connection (I choose to do this in order to spare time on connection borrow).