簡體   English   中英

有關Servlet應用程序中的連接池的一些問題

[英]Some questions about connection pooling in a servlet application

我是Web應用程序設計中Java的新手 ,但我感到驚訝的是我現在沒有多少東西。
特別是在理解servlet容器如何管理資源(如連接池類)時遇到問題。

假設我選擇了一個池庫(比方說c3p0),我讀到有很多使用和管理連接池類的方法。

例如,在許多示例中,我看到某個類(例如ComboPooledDataSource)在servlet的init()方法中實例化,在這里我有點困惑。 我的意思是,我認為一個連接池系統必須存在,並且對於需要連接的所有servlet都有單獨的生命,否則就沒有意義。 因此,我認為下面的類可能是一個線程,該線程從調用init方法的第一個servlet啟動一次,然后一直存在,直到有人不中斷它為止。 那是對的嗎? 如果沒有,它如何運作?

無論如何,一旦啟動此類,它是否在上下文中的所有servlet之間共享(我的意思是在init方法中調用它的所有servlet)?

其他示例將連接池系統設置為資源,例如在context.xml中定義它,然后任何需要連接的servlet都必須通過JNDI訪問它(JNDI是正確的嗎?)。 我了解(或我認為)的是,在這種情況下,將在應用程序啟動時啟動執行池系統的線程,並且每個Servlet都可以在需要時訪問它。 那是對的嗎?

在這種情況下,我可以通過servlet或后台線程運行時來修改連接池系統屬性嗎? (例如,如果我想根據請求數的統計信息來更改連接數等)

如果我想創建不同的池(例如,我想將數據庫訪問權限細分為N個不同的數據庫,或者我想使用不同的用戶名進行訪問),是否需要創建與我想要的其他類型的連接一樣多的資源?

這兩者之間是否存在“更好”的方式,或者它們是等效的?

它歸結為易於使用的Web應用程序和(Tomcat)服務器維護。
您描述了2個用例:

  1. 一個webapp使用的連接池
  2. Webapp之間共享的連接池

第一種情況適合於“易用性”:您可以將war文件放在任何Tomcat服務器中,並且由於web應用程序包含訪問數據庫所需的所有代碼,因此它可以工作(例如Jenkins提供了這樣的war文件)。 無需更改Tomcat服務器的配置並重新啟動它。
如果可以的話,我喜歡提供這類war文件,因為出錯的地方更少了(例如,與其他Web應用程序的配置沒有沖突)。 您可以通過提供嵌入有應用程序的Tomcat來進一步采取措施(因此,您不需要Tomcat服務器作為開始, 此處為示例項目)。

請注意,打開數據庫連接池(最好通過ServletContextListener.contextInitialized而不是servlet)並關閉它(通過contextDestroyed )並不涉及啟動和停止線程。 池實現可以決定啟動后台線程(例如,刪除空閑和/或放棄的連接),但是不必這樣做。

第二種情況適用於具有共同點的幾個Web應用程序。 例如,如果所有都在同一個Tomcat服務器上運行的多個Web應用程序都使用相同的數據庫,如果Tomcat服務器已經具有可用於不同Web應用程序的連接池(通過JNDI),則可以節省時間和精力。 Tomcat服務器可以在“ lib”目錄中包含JDBC驅動程序軟件和連接池軟件,並且只需在服務器的context.xml中進行一次配置即可。 如果數據庫更改或需要不同的(已修補的)軟件組件,則僅需要更新tomcat服務器,並且所有Web應用程序都可以保持不變。 在這種情況下,更新Tomcat服務器而不是每個Web應用程序要容易得多。

第二種情況也更適合監視:您很有可能可以通過JMX監視連接池。 這種監視可能在第一種情況下不可用。

連接池不需要更改“根據請求數統計信息來確定連接數”:您可以設置要使用的最大連接數,並可以設置超時來刪除空閑連接。 然后,連接池將隨着請求數量的增長和收縮。

將數據庫訪問權限細分為N個不同的數據庫,每個數據庫將需要一個不同的連接池,除非這是“只讀”的,在這種情況下,您還可以使用負載平衡器。

使用不同的用戶名進行訪問有些棘手。 我讀了另一個問題(抱歉,我現在找不到了),您可以在運行時更改架構,但是更改用戶名/密碼可能需要新的連接,在這種情況下,連接池將消失。

您是否正在使用Tomcat運行servlet? Tomcat 7具有您可以研究的新池化解決方案。 Tomcat還包括dbcp庫,您可以通過設置factory =“ org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”來使用它們。 DBCP池是自我管理的,您可以在context.xml文件中定義配置值,我不知道如何動態更改這些值。 我相信Tomcat 7池使用與DBCP相同的配置,並帶有幾個添加的選項,以使兩者之間的轉換變得簡單。 我們在所有應用程序中都使用DBCP,並且沒有遇到問題,因此我沒有使用Tomcat 7池。 我認為您需要創建許多池來處理大多數需求。

暫無
暫無

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

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