簡體   English   中英

SQL Server的數據源Microsoft JDBC驅動程序(AlwaysOn可用性組)

[英]Datasource Microsoft JDBC Driver for SQL Server (AlwaysOn Availability Groups)

當從使用Microsoft JDBC Driver 4.0的Java應用程序連接到具有AlwaysOn可用性組以設置高可用性的SQL Server 2014 ,我遇到與場景有關的問題。

通過此設置,我們將連接到可用性組偵聽器(在db連接字符串中指定,而不是在任何特定實例中指定),以便該偵聽器正常處理數據庫故障轉移等,並嘗試連接到如果當前主要節點在AG集群中出現故障,則場景中的下一個可用實例。

我的問題是

  1. 在j2ee應用程序服務器端配置的數據源(我們使用WebSphere)中,那些已經由數據源池化的連接會發生什么?

  2. 當數據庫發生故障時,盡管AG偵聽器會嘗試在db端重新連接到下一個可用的DB,但AG偵聽器還會通過jdbc驅動程序向在應用服務器上創建的數據源發送事件或事件,並進行確保已經被數據源池化的那些連接將被丟棄並讓其創建新連接,以使應用程序端的事務不會失敗(盡管它們可能會持續一段時間,直到創建新連接並成功進行故障轉移)或java應用程序僅在從數據源請求后才需要查找?

該SQL Server JDBC驅動程序的版本4很舊,對常開功能一無所知。

可以將任何數據源連接池配置為在將其分發給客戶端之前檢查來自該池的連接狀態。 如果無法使用該連接,則池將創建一個新的連接。 所有供應商和版本都是如此。 我相信這是您可以做的最好的事情。

WebSphere Application Server能夠處理錯誤的連接並將其從池中除去。 究竟何時發生,取決於某些可配置的選項以及Microsoft JDBC驅動程序充分利用javax.sql.ConnectionEventListener API將通知發送到應用程序服務器的能力。 在理想的情況下,JDBC驅動程序立即為所有連接發送connectionErrorOccurred事件,WebSphere Application Server通過從池中除去所有這些連接並通過將當前正在使用的任何連接標記為不良來響應,從而不會返回它,從而做出響應。一旦應用程序關閉了句柄,就將池添加到池中。 缺少此功能,WebSphere Application Server將在應用程序下次使用時發現第一個不良連接。 可以通過當時由JDBC驅動程序發送的connectionErrorOcurred事件來發現它,或者通過檢查異常的SQLState /錯誤代碼以了解不良連接的已知指示器來發現該事件。 然后,WebSphere Application Server將根據已配置的清除策略從池中清除不良連接。 有3種選擇:

  1. 整個池的清除策略-將所有連接從池中刪除,並將正在使用的連接標記為不良,以便不對其進行池化。
  2. 僅清除連接失敗的清除策略-僅將實際發生錯誤的特定連接從池中刪除或標記為不良而不返回到池中
  3. 驗證所有連接的清除策略-測試所有連接的有效性(Connection.isValid API),發現不良的連接將從池中刪除或標記為不良,而不返回到池中。 被發現有效的連接保留在池中並繼續使用。

根據您的描述,我不確定您使用的是傳統的WebSphere Application Server還是Liberty。 如果是傳統的,則在將連接從池中移出時,還可以使用其他選項進行預測試,但是請注意,將其打開可能會影響性能。 就是說,需要注意的一件事是,無論上述任何情況如何,您的應用程序都將始終需要能夠處理由於不良連接而導致的錯誤可能性(即使清除了連接池,連接也可能變為不良狀態)並通過請求新的連接並在新的事務中重試該操作進行響應。

暫無
暫無

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

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