簡體   English   中英

死連接返回到JDBC連接池-Glassfish 3.1.2.2

[英]Dead Connections Returned to JDBC Connection Pool - Glassfish 3.1.2.2

我在上的連接池遇到問題,無法發出數據庫連接。 我正在使用jconn3(com.sybase.jdbc3)運行Glassfish 3.1.2.2以連接到Sybase 12.5。 我們的組織每晚執行一次重新引導過程,在此期間我們將重新啟動Sybase服務器。 當在重新啟動過程中嘗試使用數據庫連接時,我的問題顯現出來。 以下是產生我的問題的操作順序:

  • Sybase關閉以重新啟動。
  • 從池請求連接。
  • 數據庫操作失敗。
  • 連接以關閉狀態返回到池中。
  • Sybase已備份。
  • 從池請求連接。
  • 由於“連接已關閉”異常,數據庫操作失敗。
  • 連接返回到池
  • 我已經實現了一個數據庫恢復單例,試圖從這種情況下恢復。 每當發生數據庫異常時,我都會進行jmx調用來暫停所有隊列並在JDBC連接池上執行flushConnectionPool操作。 如果數據庫連接仍未建立,則該過程將設置一個計時器,以在10分鍾內重試。 盡管此過程有效,但並非沒有缺陷。

    我知道池上有一個設置,因此您可以在分發數據庫之前對數據庫連接進行驗證,但是出於性能原因,我對此不屑一顧。 我的流程每天執行大約500萬次數據庫事務。

    我的問題是,是否有人知道首先避免將無效連接返回到池中的方法?

    您已經很好地總結了選擇。 我們遇到了這個問題,午夜數據庫崩潰了。 對於我們來說,我們啟用了連接驗證,但沒有您的交易量。

    Glassfish提供了一個自定義驗證選項,可以使用該選項指定一個類來進行驗證。

    默認情況下,Glassfish提供的所有類都可以執行(您將在控制台中看到它們作為選項提供)是這樣的SQL語句:

    SELECT 1;
    

    數據庫之間的語法略有不同,SQL Server使用'1',而對於Postgres,僅使用1。但是意圖是相同的。

    最終,每次嘗試建立連接時,都會付出額外的數據庫命中費用,但這確實是非常便宜的命中。 但是仍然很受歡迎。

    但是您可以實現自己的版本。 它可以執行檢查,例如,每10個請求一次,甚至更少一次。 將隨機數從1滾動到N(N = 10、20、100 ...),如果得到的是“ 1”,請執行選擇(如果失敗,則失敗),否則返回“ true”。 但同時,對其進行配置,以便如果您確實檢測到錯誤,請清除整個池。 顯然,對它進行了調整,因此與數據庫峰值處理相比,當數據庫在晚上宕機(不知道您的系統晚上有多忙)時,您很有可能會發生這種情況。

    您甚至可以在峰處理過程中“降低幾率”。 “如果凌晨6點至下午6點之間的時間,則賠率= 1000,否則賠率= 100;如果(random(odds)== 1){請選擇...}”

    隨機選項消除了維護線程安全計數器的需要。

    最后,這並不重要,您只需要及時注意數據庫已關閉,就可以要求GF中止該池。

    我可以肯定地看到,在數據庫啟動時,它在開始時就有些混亂,可能不止刷新一次池,但這應該是無害的。

    您可以使用不同的方式進行操作,但這是考慮的途徑。

    暫無
    暫無

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

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