dev@glassfish.java.net

BUG? Validation of database connection (Connection pooling)

From: Andy Knight <Andy.Knight_at_Sun.COM>
Date: Tue, 19 Jan 2010 07:11:52 +0000

As far as I know (and please tell me if there's another way) the correct generic mechanism for testing the validity of a database connection is to use the isValid() method of java.sql.Connection

In this example, the underlying DB is Oracle and, of course, one could invoke "SELECT * FROM DUAL;" to test the connection. In fact, I believe that's what the GlassFish Connection Pool does by default for Oracle. However, in principle, I don't know that it's Oracle and so I need a generic technique.

If I acquire a connection from the GlassFish v2.1 Connection Pool and invoke isValid(), a rather unpleasant Exception occurs. Here's a Java code fragment that demonstrates the problem...

Connection c = ((DataSource) new InitialContext().lookup("jdbc/myOracle")).getConnection();
c.isValid(10);

...and here's the Exception...

Caused by: java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid(I)Z
        at com.sun.gjc.spi.jdbc40.ConnectionHolder40.isValid(ConnectionHolder40.java:196)
        at com.sun.fast.OracleBean.ConnectAndValidate(OracleBean.java:20)

The class com.sun.gjc.spi.jdbc40.ConnectionHolder40 is obviously a subclass of java.sql.Connection and is, in fact, the type returned by getConnection().

According to the Javadocs for AbstractMethodError...

Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.

How can I work around this?

         Andy Knight
Principal Engineer,
Sun Microsystems, Inc.
Java House, Guillemont Park, Minley Road,
Camberley, Surrey GU17 9QG United Kingdom
Home office: +44 1494 462438
Mobile: +44 7775 583415
Skype: aprknight
Email: Andy.Knight_at_Sun.COM
Blog: http://blogs.sun.com/andky