簡體   English   中英

動態配置多個數據庫連接的最佳方法

[英]Best way to configure multiple database connections dynamically

我使用Java開發了一個多租戶應用程序。 在這種情況下,我將GlassFish用於我的Application Server。 它將主要在AngularJS上運行,並帶有Jersey的RESTful后端。 我將不使用ORM,因為大多數數據庫交互將被編碼並優化到存儲過程中。

有一個主數據庫,用於保存應用程序數據,配置和租戶列表。 現在,每個租戶將在各自的數據庫中擁有相同數據庫結構的副本,每個副本都有各自的唯一數據。 該應用程序將檢查每個密鑰,並確定哪個密鑰屬於哪個用戶以及哪個租戶。 然后它將在其各自的數據庫上執行該用戶請求。

問題是,Postgres不允許我即時切換數據庫,因此必須在連接字符串中進行硬編碼,並且不允許我讀取其他數據庫。 唯一的方法是創建到數據庫的多個連接。 此外,我認為從租戶B連接交叉執行數據庫租戶A中的存儲過程是不明智的。

我嘗試成功使用Apache的BasicDataSource實現,但是我不禁一直以為我缺少某些東西,因為GlassFish具有自己的ConnectionPool。 在GlassFish的Application Server中使用Apache似乎是多余的,並且將超越使用Application Server而不是普通Servlet的目的。 但是,如果沒有在JNDI中對它們進行硬編碼,就找不到如何配置GlassFish的DataSource的參考。

以下是我當前的Apache的實現:

public static BasicDataSource createPool(String database) {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName(configFile.getValue("database.driver"));
    ds.setUrl(configFile.getValue("database.url").concat(database));
    ds.setUsername(configFile.getValue("database.user"));
    ds.setPassword(configFile.getValue("database.password"));
    return ds;
}

對我來說,為每個租戶創建一個JNDI是不可能的,此外,我不知道數據庫名稱是什么。 我知道的唯一一個是我的主要配置數據庫。

關於如何在GlassFish中打開與未知數據庫名稱的連接,是否有任何建議? 怎么樣? 還是我應該堅持使用Apache? 如果我堅持使用Apache,那么完全刪除GlassFish並改用Tomcat更好嗎?

謝謝

諸如GlassFish之類的Java EE服務器上的JNDI數據源是靜態綁定的,並且必須經過全面配置才能正常工作,並且在使用期內不得修改。

JDBC連接池是特定數據庫的一組可重用連接。

否則,如果該池是多個數據庫連接池的混合,服務器如何能夠對數據庫連接池執行所需的優化? 有關更多詳細信息,您可以在此處閱讀有關Java EE DataSource的信息

在您的情況下,Glassfish提供的靜態配置的池似乎無關緊要。
因此,實際上,如果您已為連接池安裝了GlassFish,則不需要它。
此外,Java EE服務器比Tomcat的Servlet容器具有更多的開銷(CPU,內存等),因為它們本身提供了更多功能(即使GlassFish在此游戲中不是最差的)。
因此,作為一般建議,如果您不使用Java EE服務器中的許多功能而可以選擇,則不應使用它們,而應使用servlet容器。
使用Java EE Server的另一個參數可能是使用僅適用於它們的特殊性:EJB,JTA,EAR,特定於供應商的功能,更豐富的管理控制台...

您使用org.apache.commons.dbcp.BasicDataSource動態創建數據源和Tomcat的想法似乎符合您的需求。

暫無
暫無

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

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