Персистентный блок жалуется, что источник данных закрыт, даже если он не - PullRequest
0 голосов
/ 15 мая 2019

У меня есть модуль персистентности, который работал на Apache TomEE 7.0.4 (eclipselink 2.6.4), но после обновления до TomEE 7.1.0 (eclipselink 2.7.4) вызовы JPA через некоторое время перестали работать.Файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="xxxPU" transaction-type="JTA">
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <jta-data-source>xxxDB</jta-data-source>
    <properties>
      <property name="openjpa.jdbc.DBDictionary" value="mysql"/>
      <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
    </properties>
  </persistence-unit>
</persistence>

Источником данных, определенным в файле tomee.xml, является

  <Resource id="xxxDB" type="javax.sql.DataSource">
        UserName = xxxx
        Password = yyyy
        JdbcDriver = com.mysql.jdbc.Driver
        JdbcUrl = jdbc:mysql://localhost/dbname
        JtaManaged = true
    factory = org.apache.tomcat.jdbc.pool.DataSourceFactory
    ConnectionProperties = autoReconnect=true;autoReconnectForPools=true;zeroDateTimeBehavior=convertToNull;useUnicode=yes;characterEncoding=UTF-8;useSSL=false
    defaultAutoCommit = false
    testOnBorrow = true
    validationQuery = SELECT 1
    validationInterval = 30000
  </Resource>

Через некоторое время происходит сбой в журнале:

15-May-2019 19:12:49.236 SEVERE [ajp-nio-8009-exec-10] org.apache.openejb.core.transaction.EjbTransactionUtil.handleSystemException EjbTransactionUtil.handleSystemException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.3.v20180807-4be1041): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Error Code: 0

Очевидно, что MySQL соединение закрыто, но на самом деле это не так.У меня есть сервлет, который, когда HTTP GET, подтверждает, что источник данных в порядке:

@Resource(name=xxxDB)
DataSource dataSource;

....

try (Connection connection = dataSource.getConnection()) {
// do a query to prove connection OK
}

У меня есть задание cron, которое получает этот сервлет каждый час.Соединение в порядке даже после того, как JPA сгенерирует com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException

Моя среда Java 8, TomEE 7.1.0, Eclipselink 2.7.3

1 Ответ

0 голосов
/ 19 мая 2019

Проблема с Eclipselink 2.7. Я добавил в источник данных следующие параметры:

testOnBorrow = true
testWhileIdle = true
timeBetweenEvictionRuns = 60000 millisecond
testOnReturn = true
validationQuery = SELECT 1
validationInterval = 30000

Это не удалось при закрытом соединении с apache-tomee-plume, но нормально для apache-tomee-plus. Оба версии 7.1.0, только то, что «плюс» использует openjpa, но plume использует eclipselink.

...