我有一个长时间运行的方法,它通过 EntityManager (TopLink Essentials) 执行大量本机 SQL 查询。每个查询只需几毫秒即可运行,但有数千个。这发生在单个 EJB 事务中。15 分钟后,数据库关闭连接,导致以下错误:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b02-p04 (04/12/2010))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Closed Connection
Error Code: 17008
Call: select ...
Query: DataReadQuery()
at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:319)
.
.
.
RAR5031:System Exception.
javax.resource.ResourceException: This Managed Connection is not valid as the phyiscal connection is not usable
at com.sun.gjc.spi.ManagedConnection.checkIfValid(ManagedConnection.java:612)
在我设置的 JDBC 连接池中is-connection-validation-required="true"
,connection-validation-method="table"
但这并没有帮助。
我假设 JDBC 连接验证可以准确处理此类错误。我还查看了 TopLink 扩展 (http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-extensions-094393.html) 以了解某种超时设置,但一无所获。还有 TopLink 会话配置文件(http://download.oracle.com/docs/cd/B14099_19/web.1012/b15901/sessions003.htm),但我认为那里也没有任何用处。
我无权访问 Oracle DBA 表,但我认为 Oracle 根据 CONNECT_TIME 配置文件变量中的设置在 15 分钟后关闭连接。
有没有其他方法可以让 TopLink 或 JDBC 池重新建立一个关闭的连接?
数据库是Oracle 10g,应用服务器是Sun Glassfish 2.1.1。