我有一个长时间运行的方法,它通过 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"
and 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。
所有 JPA 实现(在 Java EE 容器上运行)都使用具有关联连接池的数据源来管理与数据库的连接。
持久化上下文本身通过适当的条目与数据源相关联persistence.xml
。如果要更改客户端的连接超时设置,则必须重新配置关联的连接池。
在 Glassfish 中,可以通过编辑池设置来重新配置与连接池关联的超时设置,如以下链接中所列:
- 更改 GlassFish 3.1 中的超时设置 http://download.oracle.com/docs/cd/E18930_01/html/821-2431/abehp.html#abehu
- 更改 GlassFish 2.1 中的超时设置 http://download.oracle.com/docs/cd/E19879-01/820-4343/abehu/index.html
在服务器端(其设置如果低于客户端设置,则更为重要),Oracle 数据库可以配置为具有与用户帐户关联的数据库配置文件。这配置文件的会话idle_time和connect_time参数 http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_6010.htm将构成客户端-服务器交互的这方面的重要超时设置。如果未设置配置文件,则默认情况下,超时是无限制的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)