我使用Java开发了一个多租户应用程序。在这种情况下,我使用GlassFish作为我的应用服务器。它将主要在AngularJS上运行,而泽西的RESTful后端。我不打算使用ORM,因为大多数数据库交互都将编码并优化为存储过程。
有主数据库,它保存应用程序数据、配置和租户列表。现在,每个租户都将在自己的数据库中拥有相同数据库结构的副本,每个数据库都有自己独特的数据。该应用程序将检查每个键,并确定哪个键属于哪个用户,以及哪个租户。然后,它将在各自的数据库上执行该用户请求。
问题是,Postgres不允许我动态地切换数据库,所以它必须在连接字符串中进行硬编码,而且它不允许我读取其他数据库。唯一的方法是创建到数据库的多个连接。此外,我认为交叉执行数据库租户A中的存储过程与承租者B连接是不明智的。
我试图成功地使用Apache的BasicDataSource实现,但我忍不住认为我遗漏了一些东西,因为GlassFish有自己的ConnectionPool。在GlassFish的应用服务器中使用Apache似乎是多余的,这将超出使用Application而不是普通Servlet的目的。但是,如果没有在JNDI中对GlassFish的DataSource进行硬编码,我就找不到任何关于如何配置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是否更好呢?
谢谢
发布于 2016-08-07 20:10:02
Java服务器(如GlassFish )上的JNDI数据源是静态绑定的,必须对其进行完全配置以使其正常工作,并且不能在其生命周期内进行修改。
JDBC连接池是特定数据库的一组可重用连接。
否则,如果数据库连接池是多个数据库连接池的混合,那么服务器如何能够对数据库连接池执行所需的优化?有关更多细节,您可以阅读有关Java 这里的信息。
在您的示例中,Glassfish提供的静态配置池似乎无关紧要。
因此,如果您已经为连接池安装了GlassFish,实际上,您不需要它。
此外,Java服务器有更多的开销(cpu、内存等.)servlet容器作为Tomcat,因为它们提供了更多的本机特性(即使GlassFish不是这个游戏中最糟糕的)。
因此,作为一般建议,如果您不使用来自Java服务器的许多特性,并且您有选择余地,那么您不应该使用它们,而应该使用一个servlet容器。
使用Java的另一个论点可能是使用只对它们可用的特性: EJB、JTA、EAR、特定于供应商的特性、更丰富的管理控制台.
使用org.apache.commons.dbcp.BasicDataSource动态创建数据源和Tomcat的想法似乎与您的需要相匹配。
https://stackoverflow.com/questions/38817371
复制相似问题