簡體   English   中英

沒有連接池的Web應用程序的數據庫連接

[英]Database Connections from Web Application without connection pool

我正在嘗試圍繞從JSF Web應用程序建立與數據庫的JDBC連接的正確方法來解決問題。 解決此問題的常規方法是在應用程序服務器中創建一個數據源,並通過其代碼內的JNDI名稱連接至該數據源。 本質上,所有用戶在整個會話期間都將通過池共享同一個數據庫用戶帳戶。

不幸的是,我正在處理的新項目的要求使我無法這樣做。 連接到應用程序的每個用戶都必須使用唯一的憑據登錄到RDBMS。 我對如何實現與此相關的代碼有一個大概的了解,但是我對整個體系結構並不百分百清楚。 應用程序服務器(Tomcat,Glassfish,WebLogic)是否具有支持此功能的功能?

現在,我似乎能夠完成此操作的唯一方法是讓每個用戶會話直接創建返回數據庫的JDBC連接。 盡管我相信這會行得通,但感覺並不對。

我想念什么嗎?

您缺少的東西-我非常認為:合理的系統設計。 ;)用他們的數據庫憑據管理用戶的整個想法對於僅一種用例即管理數據庫來說是好的。 對於其他所有方面,它帶來的問題多於其所能解決的問題。因此,讓狗屎暴風開始...;)

BOT:有一個難題。 基本上,您必須為每個用戶創建一個連接池,這僅僅是因為否則,您必須在每次數據源在連接超時中運行時都必須創建與數據庫的連接。 而且,三向握手和身份驗證並不是一件容易的事-延遲會降低性能。 雖然可以相應地配置一些驅動程序,但這通常是一個壞主意,並且大多數驅動程序本身都不善於管理連接,因為所謂的“關注分離”。 另一方面,每個連接“池”僅需要大約5個連接,因為同一用戶不太可能並行執行許多操作。

注意:我知道,唯一可以很好地管理連接和池的驅動程序是MongoDB的驅動程序。

現在是問題所在:您無法將連接池附加到會話。 並非沒有走幾英里,我懷疑這是否完全可能。

解決此問題的一種方法是在用戶登錄時為用戶創建一個連接池,並使用JNDI動態注冊它。 問題是這不是很可擴展(假設您有數百個用戶)。 因此,您必須確保在會話終止時(通過注銷或超時)刪除池。 另外,必須維護代碼。

另一個想法是使用Apache Shiro並編寫一個自定義領域,該領域只是嘗試登錄數據庫以檢查憑據,如果失敗則拋出AuthenticationExcepion。 這里的權衡是每次都必須初始化一個連接,這會有一些延遲。 您的領域甚至可能使用應用程序范圍的連接池,並檢查數據庫元數據中的身份驗證和授權數據。 當然,這將有必要以特權用戶身份訪問數據庫-這是一個可怕的想法。

底線:無論您以哪種方式查看,通過數據庫管理應用程序的身份驗證和授權需求都可以消除應用程序中的身份驗證和授權層,但是反過來又需要一個附加的抽象層(您不想更改您的服務的代碼,以防某些數據庫機制發生變化,對嗎?),這會帶來可伸縮性問題,就像我們看到的那樣,並且將您的代碼與一個數據庫非常緊密地聯系在一起(當然,您不希望獲得細粒度的權限,並且可以使用“工作,無效”的結果)。

我不確定一個空的連接池的開銷是多少,也不知道涉及多少用戶,但是我建議保留為低連接數(2?)配置的連接池全局列表,並在所有情況下都設置積極的超時時間返回零池連接的方式。 然后,當用戶登錄時,檢查他們是否已經有一個由其用戶名引用的池,如果沒有,請創建一個新池,並將其粘貼在池中,然后使用該池進行該用戶的連接。

這樣,您可以以最少的開銷獲得池的好處。 這是否可行可能取決於您的用戶數量。

我當然希望找到對您有用的最低開銷的池實現-有多種選擇。 c3p0對我自己非常有用。

暫無
暫無

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

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