2009-01-08 47 views
0

我們在使用JDBC連接到SQL Server數據庫的Tomcat 6中運行的Java Web應用程序遇到問題。Tomcat中的SQL Server連接管理6

經過幾次請求,應用程序服務器就會死亡,而在日誌文件中,我們發現與數據庫連接失敗相關的異常。

我們現在沒有使用任何連接池,我們正在使用標準的JDBC/ODBC/ADO驅動程序橋接來連接到SQL Server。

我們應該考慮使用連接池來消除問題嗎?

此外,我們應該改變我們的驅動程序像jTDS?

回答

1

如果您未關閉JDBC連接,則這是正確的行爲。

當您完成使用它以及您獲得的其他JDBC資源時,您必須調用每個JDBC資源的close()方法。

這適用於Connection,Statement/PreparedStatement/CallableStatement,ResultSet等。

如果您未能做到這一點,那麼您對SQL服務器上的潛在巨大且可能非常有限的資源囤積了起來。

最終,不會授予連接,執行查詢並返回結果將失敗或掛起。

如果您沒有將autoCommit屬性設置爲true,那麼如果您在每個事務結束時未能提交()或rollback(),則可能還會注意到您的INSERT/UPDATE/DELETE語句掛起。

我所看到的是,如果將上面提到的嚴格應用到您的JDBC客戶端代碼,那麼JDBC和您的SQL服務器將會非常順利地工作。如果你寫垃圾,那麼一切都會像垃圾一樣。

許多人編寫的JDBC調用期望通過調用close()來釋放每件事情,因爲這很無聊,應用程序和服務器在離開時不會立即失敗。

確實如此,但這些程序員已經編寫了他們的程序,用他們的服務器播放「99瓶啤酒在牆上」。

的資源將被耗盡和請求往往會導致一個或多個以下情況發生:連接請求立即失敗,SQL語句立即失敗或掛起永遠存在,直到一些godawful冗長的事務超時定時器超時等

因此,解決這些類型SQL問題的最快捷方式不是責怪SQL服務器,應用程序服務器,Web容器,JDBC驅動程序,或者Java垃圾收集器中嵌入的人工智能的缺乏令人失望。

解決這些問題的最快方法是拍攝在您的應用程序中使用Nerf dart與您的SQL服務器交談時編寫JDBC調用的人。當他說,「你爲...做了什麼?!」只要指出這篇文章,並告訴他閱讀它。 (切記不要拍攝眼睛,手中的東西,可能是危險/脆弱的東西等)

至於連接池解決你的問題...沒有。很抱歉,連接池只是通過向您的應用程序傳遞一個預先分配的,或許可以循環使用的連接來加快呼叫速度,從而獲得連接。

牙仙把錢放在枕頭下,復活節兔子把雞蛋&糖放在你的灌木叢下,聖誕老人把禮物放在你的樹下。但是,抱歉打破你的幻想--SQL服務器和JDBC驅動程序不會關閉所有東西,因爲你「忘記」關閉你自己分配的所有東西。

1

我一定會試試jTDS。我以前用Tomcat 5.5使用它,沒有任何問題。這似乎是一個相對快速,影響較小的變化,可以作爲調試步驟。我認爲你會發現它更快,更穩定。它也有開源的優勢。

從長遠來看,我認爲你會想要考慮性能方面的連接池。當你這樣做時,我建議看看c3p0。我認爲它比Tomcat的內置池選擇更靈活,我通常更喜歡「超出容器」解決方案,以便在將來更換容器時不那麼痛苦。

+0

有沒有人給jTDS試一試?我使用sql server 2000 jdbc連接器運行Tomcat 5.5,並遇到處理特殊字符的問題。這是一個非常痛苦的問題。 – phill 2009-05-29 04:12:00

1

這很難說,真的,因爲您提供的實際故障信息如此之少:

幾個請求後,應用程序 服務器死機和在日誌文件中 我們發現相關異常數據庫 連接失敗。

你能告訴我們:

  • 完全錯誤是什麼 你看到
  • 給我們的代碼的一小 例如,你 連接和服務的 之一請求
  • 它是否一致 它 失敗或者看起來是隨機的交易數

我寫了很多與數據庫相關的java代碼(幾乎所有的代碼都與數據庫相關),並使用了MS驅動程序,jdt驅動程序和jnetDirect中的一個。

我確定如果您向我們提供更多詳情,我們可以爲您提供幫助。