多租户接缝+ JPA应用程序

时间:2011-03-16 20:13:21

标签: jpa seam multi-tenant

我在现有的Seam 2.2.0 + JPA(Hibernate 3.3.1)应用程序上工作,该应用程序需要转换为“每个客户端的单个数据库”环境,其中每个数据库架构都是相同的。该应用程序在Glassfish上运行,使用IceFaces,并且有几个页面使用Conversations。它还使用单个EJB进行身份验证。不幸的是,将客户分成他们自己的数据库的决定是我无法控制的。

作为概念验证,我已经通过使用Spring JPA抽象,资源本地事务和ThreadLocal将上下文信息的EntityManagerFactory(ies)和DataSource的管理移动到应用程序中,使应用程序知道多个数据库。 。例如,每次用户登录新的EntityManagerFactory时,都会使用与其数据库进行通信的新DataSource进行初始化(如果尚未初始化)。这在具有少数数据库的测试环境中运行良好。

我的问题是,这种方法会扩展到数百个数据库吗?我希望将应用程序服务器添加到负载均衡器以处理额外的负载,但是Hibernate / JPA第一级缓存和/或Seam上下文管理(也就是内存消耗)的开销需要比典型的服务器更多的服务器扩展负载均衡应用?如果是这样,可以通过分配具有大量RAM和/或大型分布式缓存的服务器来减轻这种情况吗?

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

我使用这种方法开发了一个应用程序,我可以指出的是:

  • Datasource和EntityManagerFactory管理是困难的部分。但是,您似乎已经在测试环境中执行了此操作。仔细检查您是否就Seam Managed Entity Manager做了正确的事。
  • 您的应用程序无法在数百个数据库上很好地扩展,因为每个数据库的内存消耗都会线性增加。事实上,对于每个数据库,您将拥有EntityManagerFactory(Hibernate SessionFactory)的不同实例,每个实例都需要相当数量的Ram。
  • 如果配置Hibernate二级缓存,请注意可能出现的问题。由于所有SessionFactories都是从相同的数据模型创建的,因此缓存区域名称可能会发生冲突。我使用hibernate.cache.region_prefix配置参数在使用数据库ID作为缓存前缀的各种实例中使这些名称成为唯一的。