Datasource validation does not work when non-jta-datasource is used in persistence.xml in JBoss EAP 6
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>inpersistence.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
EntityManagerand the transactions manually. That is why the application uses local transactions withautoCommit=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.