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

Java 动态配置多个数据库连接的最佳方法,java,connection-pooling,postgresql-9.4,glassfish-4.1,Java,Connection Pooling,Postgresql 9.4,Glassfish 4.1,我正在使用Java开发一个多租户应用程序。在本例中,我将GlassFish用于我的应用程序服务器。它将主要在AngularJS上运行,带有Jersey的RESTful后端。我不打算使用ORM,因为大多数数据库交互都将编码并优化到存储过程中 主数据库保存应用程序数据、配置和租户列表。现在,每个租户都将在自己的数据库中拥有相同数据库结构的副本,每个副本都有自己独特的数据。应用程序将检查每个密钥,并确定哪个密钥属于哪个用户和哪个租户。然后,它将在各自的数据库上执行该用户请求 问题是,Postgres不

我正在使用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呢


谢谢

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

JDBC连接池是一组可重用的连接,用于 特定数据库

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

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


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

JavaEE服务器(如GlassFish)上的JNDI数据源是静态绑定的,必须完全配置为工作状态,并且在其生命周期内不得修改

JDBC连接池是一组可重用的连接,用于 特定数据库

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

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


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

多谢各位。我也在使用JavaMail,还有JAX-WS和Jersey。但我认为最好只包含库,而不是使用完整的应用程序服务器。我说得对吗?你说得对,不客气。我更新了我的答案,使Java EE的特殊性更加精确。。好啊谢谢,谢谢。我也在使用JavaMail,还有JAX-WS和Jersey。但我认为最好只包含库,而不是使用完整的应用程序服务器。我说得对吗?你说得对,不客气。我更新了我的答案,使Java EE的特殊性更加精确。。好啊非常感谢。