簡體   English   中英

超時后如何重新建立 JDBC 連接?

[英]How to reestablish a JDBC connection after a timeout?

我有一個長時間運行的方法,它通過 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 session 配置文件(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 中,與連接池關聯的超時設置可以通過編輯池設置來重新配置,如以下鏈接中所列:

在服務器端(如果其設置低於客戶端設置,則更重要),Oracle 數據庫可以配置為具有與用戶帳戶關聯的數據庫配置文件。 配置文件的session idle_time 和 connect_time 參數將構成在客戶端-服務器交互的這方面重要的超時設置。 如果未設置配置文件,則默認情況下超時是無限的。

除非您有某種 RAC 故障轉移,否則當連接終止時,它將結束 session 和事務。

管理員可能已經設置了一些限制,以防止失控的事務或單個作業“占用”池中的連接。 您通常不希望長時間鎖定池中的連接。

如果這些查詢不一定是同一事務的一部分,那么您可以嘗試終止並重新啟動新連接。

您是否能夠重組您的代碼,使其在 15 分鍾內完成。 后台的存儲過程可能比通過網絡拖動數千個操作的結果更快地完成這項工作。

我看到你設置了你的connection-validation-method="table"is-connection-validation-required="true" ,但你沒有提到你指定了你正在驗證的表; 您是否設置了validation-table-name="any_table_you_know_exists"並提供了任何現有的表名? validation-table-name="existing_table_name"是必需的。

有關連接驗證的更多詳細信息,請參閱本文

具有類似問題的相關 StackOverflow 文章- 他想刷新整個無效連接池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM