1

以下是例外:

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>

但它是在 5 天或 7 天后发现的。

错误再次出现。(有人建议保持 validateopnMatch 为真,但这并不富有成效)

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

所以它工作了几天,但它不是完整的证明解决方案

有人可以建议可以在代码中进行哪些更改来处理此问题吗?如果有人可以在数据源中提出建议,那么也可以。但似乎 Datasource 解决方案并不完全证明?

片段:

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

片段使用:

    @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();
    }
4

1 回答 1

0

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

            <datasource ...>
                ...
                <validation>
                    <validate-on-match>true</validate-on-match>
                </validation>
            </datasource>
于 2020-12-16T13:40:03.157 回答