动态配置多个数据库连接的最佳方式

Best way to configure multiple database connections dynamically

我正在使用 Java 开发多租户应用程序。在本例中,我将 GlassFish 用于我的应用程序服务器。它将 运行 主要在 AngularJS 上,使用 Jersey 的 RESTful 后端。我不打算使用 ORM,因为大多数数据库交互都将编码和优化到存储过程中。

有一个主数据库,用于保存应用程序数据、配置和租户列表。现在,每个租户都将在自己的数据库中拥有相同数据库结构的副本,每个租户都有自己独特的数据。该应用程序将检查每个密钥,并确定哪个密钥属于哪个用户和哪个租户。然后它将在他们各自的数据库上执行该用户请求。

问题是,Postgres 不允许我即时切换数据库,因此必须在连接字符串中进行硬编码,并且不允许我读取其他数据库。唯一的方法是创建多个数据库连接。此外,我认为从租户 B 连接交叉执行数据库租户 A 中的存储过程是不明智的。

我曾尝试使用 Apache 的 BasicDataSource 成功实现,但我不禁一直认为我遗漏了什么,因为 GlassFish 有自己的 ConnectionPool。在 GlassFish 的应用程序服务器中使用 Apache 似乎是多余的,并且会破坏使用应用程序服务器而不是普通 Servlet 的目的。但是我找不到任何关于如何配置 GlassFish 的数据源而不在 JNDI 中对其进行硬编码的参考。

下面是我当前的 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 会更好?

谢谢

Java EE 服务器(例如 GlassFish)上的 JNDI 数据源是静态绑定的,必须完全配置才能正常工作,并且在其生命周期内不得修改。

A JDBC connection pool is a group of reusable connections for a particular database.

否则,如果池是多个数据库连接池的混合,服务器如何能够对数据库连接池执行所需的优化? 有关详细信息,您可以阅读有关 Java EE DataSource here 的信息。

在您的情况下,Glassfish 提供的静态配置池似乎无关紧要。
所以,如果您已经为连接池安装了 GlassFish,那么您确实不需要它。
此外,Java EE 服务器比 servlet 容器 Tomcat 有更多的开销(cpu、内存等...),因为它们本身提供了更多的功能(即使 GlassFish 不是在这场比赛中最差)。
因此,作为一般建议,如果您不使用 Java EE 服务器的许多功能并且可以选择,则不应使用它们,而应使用 servlet 容器。
使用 Java EE 服务器的另一个论点可能是使用仅适用于它们的特殊性:EJB、JTA、EAR、供应商特定功能、更丰富的管理控制台...

您使用 org.apache.commons.dbcp.BasicDataSource 动态创建数据源的想法和 Tomcat 似乎符合您的需要。