Datasource validation does not work when non-jta-datasource is used in persistence.xml in JBoss EAP 6

Solution Verified - Updated -

Issue

  • We are using a MySQL datasource in one of our applications. When the database server closes the connection (e.g. after being idle for some time), JBoss cannot connect anymore and fails to check the connection validity:

WARN 2015-09-10 09:29:39,374 [HTTP-3]org.jboss.jca.core.connectionmanager.listener.TxConnectionListener 'IJ000305: Connection error occured: org.jboss.jca.core.connecti onmanager.listener.TxConnectionListener@29236d[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@d506bc connection handles=1 lastUse=1441869923697 trackByTx=false pool=org .jboss.jca.core.connectionmanager.pool.strategy.OnePool@1ad4c26 pool internal context=SemaphoreArrayListManagedConnectionPool@4da752[pool=DefaultDS] xaResource=LocalXAResourceImpl@628b0b[connectionListener=2923 6d connectionManager=186d356 warned=false currentXid=null productName=MySQL productVersion=5.6.16 jndiName=java:jboss/datasources/DefaultDS] txSync=null]: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure The last packet successfully received from the server was 245,607 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3603) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3492) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4043) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) at org.jboss.jca.adapters.jdbc.CachedPreparedStatement.executeQuery(CachedPreparedStatement.java:107) at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
  • The datasource configuration has all required validation options set:
<validation>
                        <validate-on-match>true</validate-on-match>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                    </validation>
  • We noticed that the re connection works when the datasource is referenced as a <jta-datasource> in persistence.xml:
<persistence-unit name="PU" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>*****</jta-data-source>
  • When setting the datasource to non-jta , validation does not occur:
<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>******</non-jta-data-source>
  • The application handles the EntityManager and the transactions manually. That is why the application uses local transactions with autoCommit=true:
    <persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>********</non-jta-data-source>
        <class>*****************</class>
        <class>*****************</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.interna.JBossAppServerJtaPlatform" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
    </persistence-unit>
    </persistence>

Environment

  • Red Hat JBoss Enterprise Application Platform (EAP)
    • 6.3.3

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content