簡體   English   中英

Oracle JDBC 連接超時問題

[英]Oracle JDBC connection timed out issue

數據庫連接池配置 我有一個 Web 應用程序的生產場景,當提交表單時,數據通過 JDBC 存儲在 Oracle DB 的 3 個表中。 有時,當應用程序嘗試通過 Java 代碼連接到 Oracle DB 時,我會在日志中看到連接超時錯誤。 這是間歇性的。

以下是例外:

SQL exception while storing data in table
java.sql.SQLRecoverableException: IO Error: Connection timed out

大多數情況下,Web 應用程序能夠連接到數據庫並在其中插入值,但有時我會收到此超時錯誤並且無法在其中插入數據。 我不確定為什么我會遇到這個間歇性問題。 當我檢查應用程序中的連接池配置時,我注意到以下幾點:

  • 池大小(此池可以打開的最大連接數): 10

  • 池等待(最大等待時間,以毫秒為單位,如果所有池連接都在使用,則在拋出異常之前): 1000

由於池大小僅為 10,並且如果有多個用戶嘗試連接到數據庫,會出現連接超時問題嗎?

此外,由於有 3 個表發生數據插入,因此我們僅在一個連接本身中進行整個插入。 我們不會為每個單獨的表打開每個數據庫連接。

注意:此應用程序部署在 AEM(內容管理系統)服務器上,連接池配置由它們提供。

更新:我嘗試在連接池中設置驗證查詢,但仍然出現連接超時錯誤。 我不確定連接池是否檢查了驗證查詢。 我附上了上面的連接池以供參考。

我會嘗試兩件事:

  • 嘗試設置驗證查詢,以便池每次租用連接時,您都可以確定它確實可用。 select 1 from dual應該可以工作。 在最近不需要的 JDBC 驅動程序上,但您可以試一試。

  • 估計表單的並發性。 根據您在 DB 上工作的復雜性,10 個連接池不會太小。 看來您正在保存一個表單,所以它不應該那么復雜。 您預計每天有多少用戶? 那么,在高峰時間,您希望有多少用戶同時使用該表單? 一個 10 個連接池通常可以非常快地租用和檢索連接,因此它可以每秒處理多個事務。 如果您期望更多,請稍微增加大小(超過 25-30 實際上會降低數據庫性能,因為更多查詢在那里競爭資源)。

  • 如果似乎沒有任何效果,最好檢查一下您的數據庫上發生了什么。 如果可能,請使用企業管理器查看在這三個表上執行操作時是否存在閂鎖。

我從編程的角度給出了這個答案。 這個問題有多種可能性。 這些是以下內容,我已為其添加了適當的解決方案。 當連接超時發生時,意味着您的新線程在提到的時間內無法訪問數據庫,這是由於:

  • 可能性一:沒有關閉連接,你的應用程序中的某處應該有連接泄漏 解決方案
    你需要確保這個東西,需要檢查這個泄漏並在使用后關閉連接。

  • 可能性二:大交易解決方案

    • 一世。 這些插入是否同步,如果是,那么請非常小心地使用它。 在塊級別而不是方法級別使用它。 並且您的同步塊大小應盡可能小。

      發生的情況是如果我們有大的同步塊,我們提供連接,但它會處於等待狀態,因為這個同步塊需要太多時間來執行。 所以其他線程等待時間增加。 假設我們有 100 個用戶,每個用戶有 100 個線程用於該操作。 1st 正在執行,需要很長時間。 和其他人正在等待。 所以可能會出現第 80 個第 90 個等線程拋出超時的情況。 對於某些線程,會發生此問題。

      所以你必須減少同步塊的大小。

    • ii. 並且對於這種情況還要檢查交易是否很大,然后如果可能的話嘗試將交易切成較小的:-
      舉個例子,一次插入是一個小事務。 對於第二個其他小交易,像這樣。 而這三個小事務就完成了操作。
  • 可能性三:如果應用程序的可用性太高,則池大小不夠 解決方案
    需要增加池大小。 (使用后正確關閉所有連接即可)

在這種情況下,您可以使用Java Executor 服務。一個線程一個連接,全部異步。一旦事務完成,將連接釋放回池。這樣,您就可以擺脫這個超時問題。

如果一個連接正在向 3 個表中插入數據,而其他試圖建立連接的線程正在等待,則必然會發生超時。

暫無
暫無

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

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