Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多租户Seam+;JPA应用程序_Jpa_Seam_Multi Tenant - Fatal编程技术网

多租户Seam+;JPA应用程序

多租户Seam+;JPA应用程序,jpa,seam,multi-tenant,Jpa,Seam,Multi Tenant,我在现有的Seam 2.2.0+JPA(Hibernate 3.3.1)应用程序上工作,该应用程序需要转换为“每个客户机一个数据库”环境,其中每个数据库模式都是相同的。该应用程序在Glassfish上运行,使用IceFaces,并有几个利用对话的页面。它还使用单个EJB进行身份验证。不幸的是,将客户机拆分为他们自己的数据库的决定超出了我的控制范围 作为概念证明,我已经通过使用Spring JPA抽象、资源本地事务和用于上下文信息的ThreadLocal将EntityManagerFactory和

我在现有的Seam 2.2.0+JPA(Hibernate 3.3.1)应用程序上工作,该应用程序需要转换为“每个客户机一个数据库”环境,其中每个数据库模式都是相同的。该应用程序在Glassfish上运行,使用IceFaces,并有几个利用对话的页面。它还使用单个EJB进行身份验证。不幸的是,将客户机拆分为他们自己的数据库的决定超出了我的控制范围

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

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


如果您有任何见解,我们将不胜感激。

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

  • 数据源和实体管理是工厂管理的难点。但是,您似乎已经在测试环境中这样做了。仔细检查Seam托管实体管理器方面的操作是否正确
  • 您的应用程序在数百个数据库上无法很好地扩展,因为每个数据库的内存消耗都呈线性增长。事实上,对于每个数据库,您将拥有不同的
    EntityManagerFactory
    (Hibernate
    SessionFactory
    )实例,每个实例都需要大量的Ram
  • 如果配置Hibernate二级缓存,请注意可能出现的问题。由于所有SessionFactory都是从相同的数据模型创建的,因此缓存区域名称可能会发生冲突。我使用
    hibernate.cache.region\u prefix
    configuration参数使这些名称在使用数据库id作为缓存前缀的各种实例中唯一
谢谢@Stefano。我在一个类似于产品的系统上对这些变化进行了负载测试,得出了相同的结论。我必须删除Drools授权,因为它消耗了每个
EntityManager工厂中大约50%的RAM,并且必须禁用Hibernate注释扫描,以便显式列出注释实体类。后者是一个性能瓶颈,导致了同步问题。嗨,Alex,你能给我一个使用新数据源初始化新EntityManagerFactory的例子吗?谢谢