hibernate - Wildfly - 在使用 JPA-Hibernate 重新连接期间,后台验证不适用于数据源
问题描述
以下是例外:
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();
}
解决方案
您可以将数据源配置为每次在将连接处理给应用程序之前验证连接:
<datasource ...>
...
<validation>
<validate-on-match>true</validate-on-match>
</validation>
</datasource>
推荐阅读
- java - 如何在if语句中使用异步任务结果
- google-apps-script - 使用 nextPageToken 获得 100 多个 Google Drive 评论
- pdf - Pandoc XeLatex 引擎生成的 PDF 中没有图像
- windows - 更新作为 Windows 服务运行的 exe 的最佳程序
- javascript - 如何读取浏览器存储的登录电子邮件和密码值
- python - 有没有一种简单、有效的方法可以将 5000 多张图片从谷歌存储下载(打开)到 python 笔记本?
- php - 使用内置服务器将一个 php 文件链接到另一个
- python - 在 Python 3.x 中将回历(伊斯兰日期)转换为公历
- python - 使用 nltk 进行句子检测的问题
- ios - 将数据传递给两个标签栏中的两个视图控制器