我的一个会话bean出了问题,可能是因为我对EntityManagers缺乏了解。我正在使用JBoss EAP 6.2和Oracle。
我有一个对象(称之为Maintainer),注释为@Singleton和@Startup。实例化时,会向其中注入一个@Stateless会话bean(Repository),它本身会注入一个EntityManager。
@Singleton
@Startup @Stateless @PersistenceContext()
Maintainer ----> Repository ----> EntityManager
在Maintainer的@PostConstruct方法中,它创建了一个定期运行的线程,以使用存储库从数据库中获取对象。该线程适用于应用程序的生命周期。检索对象的代码使用如下所示的本机查询:
Query query = entityManager.createNativeQuery(SQL_QUERY_ALL);
query.setParameter(DATE_PARAM_NAME, sinceLastUpdateDate);
List<Object[]> resultList = query.getResultList();
我遇到的问题是当应用程序失去与数据库的连接时,线程开始抛出“java.sql.SQLRecoverableException:Closed Connection”异常。它不会重新连接,即使在数据库恢复后我必须关闭并重新启动我的应用程序。
我确信连接恢复已构建到底层库中,因此我猜测问题出在我的代码和我对EntityManager如何管理其与数据库的连接的理解(或缺乏)。
任何人都可以清楚这一点。我正在做什么出了什么问题?
感谢。
答案 0 :(得分:0)
也许为时已晚,但为了记录,您可以在数据源上添加匹配验证,如下所示:
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<validate-on-match>true</validate-on-match>
</validation>