Wildfly-在使用JPA Hibernate重新连接期间,后台验证对数据源不起作用

Wildfly-在使用JPA Hibernate重新连接期间,后台验证对数据源不起作用,hibernate,jpa,wildfly,datasource,wildfly-16,Hibernate,Jpa,Wildfly,Datasource,Wildfly 16,以下是例外情况: 2020-12-15 05:15:00,338 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4) SQL Error: 0, SQLState: 08S01 2020-12-15 05:15:00,338 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4) I/O Error: Co

以下是例外情况:

2020-12-15 05:15:00,338 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4) SQL Error: 0, SQLState: 08S01
2020-12-15 05:15:00,338 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4) I/O Error: Connection reset
.
.
Caused by: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2167)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1930)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1892)
    at org.hibernate.loader.Loader.doQuery(Loader.java:937)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)
    at org.hibernate.loader.Loader.doList(Loader.java:2689)
    at org.hibernate.loader.Loader.doList(Loader.java:2672)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506)
    at org.hibernate.loader.Loader.list(Loader.java:2501)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:395)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1507)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1537)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505)
    ... 192 more
Caused by: java.sql.SQLException: I/O Error: Connection reset
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1093)
    at net.sourceforge.jtds.jdbc.TdsCore.microsoftPrepare(TdsCore.java:1219)
    at net.sourceforge.jtds.jdbc.JtdsConnection.prepareSQL(JtdsConnection.java:708)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:1028)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:504)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
    ... 207 more
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.DataInputStream.readFully(DataInputStream.java:195)
    at java.io.DataInputStream.readFully(DataInputStream.java:169)
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:850)
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:731)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114)
    at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:99)
    at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:4127)
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1086)
    ... 212 more
早些时候,我们经常这样做

以下是我在网上找到并在过去一个月实施的解决方案:

                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
                    <background-validation>true</background-validation>
                    <background-validation-millis>120000</background-validation-millis>
                </validation>

真的
120000
但在5天后或7天后发现

错误再次出现。(有人建议保持ValidateOnMatch为true,但这并不奏效)

重新启动或重新部署集成后,错误消失了几天

所以它工作了几天,但它不是完全可靠的解决方案

有人能建议在代码中做些什么更改来处理这个问题吗?如果有人可以在datasource中提出建议,那么也可以。但数据源解决方案似乎不是完全可靠的?

片段:

<persistence-unit name="rmPU" transaction-type="JTA">
    <jta-data-source>java:/datasources/edgermDS</jta-data-source>
</persistence-unit>

java:/datasources/edgermDS
代码段使用:

    @PersistenceContext(unitName="rmPU")
    private EntityManager entityManagerrm;
    
    public List<CommonAccount> getLatestAccounts(Date lastExportTime) {
        if(!entityManagerrm.isOpen()) {
            log.warning("Persistence:getLatestAccounts: Connection is Closed");
        }
        return entityManagerrm.createNamedQuery("Account.findCreatedAfter", CommonAccount.class).setParameter("lastExportTime", lastExportTime, TemporalType.TIMESTAMP)
                .getResultList();
    }
@PersistenceContext(unitName=“rmPU”)
私人实体管理者实体管理者;
公共列表getLatestAccounts(日期lastExportTime){
如果(!entityManagerrm.isOpen()){
警告(“持久性:getLatestAccounts:连接已关闭”);
}
返回entityManagerrm.createNamedQuery(“Account.findCreatedfter”,CommonAccount.class).setParameter(“lastExportTime”,lastExportTime,TemporalType.TIMESTAMP)
.getResultList();
}

您可以将数据源配置为在每次将连接处理到应用程序之前验证连接:

            <datasource ...>
                ...
                <validation>
                    <validate-on-match>true</validate-on-match>
                </validation>
            </datasource>

...
真的

您可以将数据源配置为在每次将连接处理到应用程序之前验证连接:

            <datasource ...>
                ...
                <validation>
                    <validate-on-match>true</validate-on-match>
                </validation>
            </datasource>

...
真的
也许会有帮助。也许会有帮助。