2012-06-13 36 views
1

我正在開發一個使用Tomcat作爲服務器和MySQL作爲數據庫的基於Java EE的應用程序。 我已經爲50個用戶配置了連接池。Java EE:當用戶超過連接中定義的數量池

現在我的問題是,如果在給定的時間有51個用戶同時訪問應用程序,第51個用戶會發生什麼? (因爲應用程序一次只支持50個連接)

我的要求是,對於第51位用戶,我需要顯示一條消息,如「 請稍後再訪問」。

這可能嗎?

回答

6

連接池爲50意味着您的WebApp最多可以連接50個數據庫,但這並不意味着您可以同時連接到您的應用的最大用戶數。

即使很多用戶同時使用您的應用程序,但並不意味着所有用戶都將使用與數據庫的連接(例如,閒置,查看靜態頁面,從緩存中獲取數據等)。

你沒有提到你使用的是什麼連接池,但我假設你正在使用任何正常的庫並正確使用它,例如每次完成查詢以返回連接到池時調用connection.close() 。

如果是這種情況,那麼不要擔心,如果池全部用完,下一個用戶將會排隊,直到一個連接返回池。

因此,您可以添加超時以檢測此隊列時間,例如,如果在5到10秒內DriverManager.getConnection()不返回,則假定池已滿並將用戶重定向到具有該消息的靜態頁面。

請記錄此事件,所以如果您知道大部分時間您的池已滿,則應該增加最大連接數。

+0

感謝Evan,你的回答看起來很有趣,「你可以添加一個超時來檢測這個隊列時間,例如,如果在5到10秒內DriverManager.getConnection()不會返回重定向到一個靜態頁面,請告訴我如何添加一個超時? – Pawan

+0

它取決於你使用的連接池是什麼?Apache DBCP? – Evan

+0

我可能會將這個過於簡單化。請參閱本文[answer](http://stackoverflow.com/questions/1164301/how-do-i-call -some-blocking-method-with-a-timeout-in-java),瞭解如何使用executor爲阻塞方法添加超時。 – Evan

1

如果您的應用程序編寫正確,您將檢查連接池外的連接,只掛上它們足夠長的時間來執行操作,並立即將它們返回到池供其他人使用。

如果你這樣做,很可能你將能夠爲50多個用戶提供50個連接的服務。

如果您在每個會話中掛上一個連接,則會發生錯誤。這永遠不會縮放。

+0

感謝您的評論,我相信我正確地管理連接(Taht讓他們進入DAO層本身),好吧,我明白51用戶放在隊列中,那麼我該如何向用戶顯示消息如果沒有任何迴應3秒?這應該在Javascript中管理? – Pawan

+0

錯了。 DAO不應該管理連接。這是服務的工作。完全有可能在網上等待超過3秒鐘。如果連接超時,請將例外發送出去並按照用戶的意願通知它。不應*爲JavaScript。 – duffymo

2

連接池本身由Tomcat管理,使其對應用程序不可見。簡而言之,作爲開發人員你不知道也不應該關心它。

您可以(而且應該)做的是確保您不會持續超出實際需要的連接。這樣你就不會讓連接池無所事事。

至於你的問題? Tomcat將第51個連接請求放入一個隊列中,只要有一個連接請求可用,就建立實際的連接。

0

連接池通常包含最大連接配置參數,該參數指定使用db設置的最大連接數。一旦連接被釋放,它就返回到池中。在選擇泳池的maxConnections時,你必須非常明智。在正常的用戶流量情況下,該數字必須是可以處理數據庫連接要求的連接數。如果遇到這種情況,在大多數情況下,連接數超過maxConnections,那麼您必須增加此數字。就你而言,我認爲你可以輕鬆地同時爲50多個用戶提供服務。除此之外,它也取決於您的應用程序邏輯。它不能長時間保持連接,不必要地連接,一旦完成,就必須釋放連接。

但是,某些連接池的實現,也允許連接池大小在不同的時間,在應用程序的不同負載下變化。