我有一个长时间运行的方法,它通过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。
答案 0 :(得分:3)
所有JPA实现(在Java EE容器上运行)都使用带有关联连接池的数据源来管理与数据库的连接。
持久性上下文本身通过persistence.xml
中的适当条目与数据源相关联。如果要更改客户端的连接超时设置,则必须重新配置关联的连接池。
在Glassfish中,可以通过编辑池设置来重新配置与连接池关联的超时设置,如以下链接中所列:
在服务器端(如果设置低于客户端设置,则更重要),可以将Oracle数据库配置为具有与用户帐户关联的数据库配置文件。在客户端 - 服务器交互的这个方面,session idle_time and connect_time parameters of a profile将构成重要性的超时设置。如果未设置配置文件,则默认情况下,超时无限制。
答案 1 :(得分:2)
除非您有某种RAC故障转移,否则当连接终止时,它将结束会话和事务。
管理员可能设置了一些限制,以防止失控的交易或单个作业“占用”池中的连接。您通常不希望长时间锁定池中的连接。
如果这些查询不一定是同一事务的一部分,那么您可以尝试终止并重新启动新连接。
您是否能够重新构建代码,以便在15分钟内完成。后台存储过程可能比通过网络拖动数千个操作的结果更快地完成工作。
答案 2 :(得分:2)
我看到你设置了connection-validation-method="table"
和is-connection-validation-required="true"
,但是你没有提到你指定了你正在验证的表;你设置validation-table-name="any_table_you_know_exists"
并提供任何现有的表名吗? <{1}}是必需的。
See this article for more details on connection validation
Related StackOverflow article with similar problem - 他想刷新整个无效连接池。