2

我有一个长时间运行的方法,它通过 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。

4

3 回答 3

3

所有 JPA 实现(在 Java EE 容器上运行)都使用具有关联连接池的数据源来管理与数据库的连接。

持久性上下文本身通过 中的适当条目与数据源相关联persistence.xml。如果您希望更改客户端的连接超时设置,则必须重新配置关联的连接池。

在 Glassfish 中,与连接池关联的超时设置可以通过编辑池设置来重新配置,如以下链接中所列:

在服务器端(如果其设置低于客户端设置,则更重要),可以将 Oracle 数据库配置为具有与用户帐户关联的数据库配置文件。配置文件的会话 idle_time 和 connect_time 参数将构成在客户端-服务器交互的这方面的重要超时设置。如果未设置配置文件,则默认情况下超时是无限的。

于 2011-05-27T14:09:32.430 回答
2

除非您有某种 RAC 故障转移,否则当连接终止时,它将结束会话和事务。

管理员可能已经设置了一些限制,以防止失控的事务或单个作业“占用”池中的连接。您通常不希望长时间锁定池中的连接。

如果这些查询不一定是同一事务的一部分,那么您可以尝试终止并重新启动新连接。

您是否能够重组您的代码,使其在 15 分钟内完成。后台的存储过程可能比通过网络拖动数千个操作的结果更快地完成这项工作。

于 2011-05-28T01:00:28.077 回答
2

我看到您设置了connection-validation-method="table"and is-connection-validation-required="true",但您没有提到您指定了要验证的表;您是否设置validation-table-name="any_table_you_know_exists"并提供了任何现有的表名? validation-table-name="existing_table_name"是必须的。

有关连接验证的更多详细信息,请参阅本文

具有类似问题的相关 StackOverflow 文章- 他想刷新整个无效连接池。

于 2011-10-21T03:06:09.877 回答