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

时间:2016-08-07 18:44:16

标签: java connection-pooling postgresql-9.4 glassfish-4.1

我使用Java开发多租户应用程序。在这种情况下,我使用GlassFish作为我的Application Server。它将主要在AngularJS上运行,使用Jersey的RESTful后端。我不打算使用ORM,因为大多数数据库交互都会编码并优化到存储过程中。

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

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

我已经尝试成功使用Apache的BasicDataSource,但我无法继续认为我错过了什么,因为GlassFish有自己的ConnectionPool。在GlassFish的应用服务器中使用Apache似乎是多余的,并且将超越使用Application Server而不是普通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?

谢谢

1 个答案:

答案 0 :(得分:0)

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

  

JDBC连接池是一组可重用的连接   特别是数据库。

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

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

您使用org.apache.commons.dbcp.BasicDataSource动态创建数据源和Tomcat的想法似乎与您的需求相匹配。