Jakarta ee 在同一服务器上使用不同的数据源多次部署EAR
让我们假设一个JavaEE6应用程序打包为一个EAR(一个EJB-JAR、N个web模块和一些库),使用JPA实现持久性 要求是,在一台机器上需要运行多个客户的应用程序。每个客户都有自己的数据库 现在的问题是,您在哪里为每个客户配置数据源,以及如何告诉应用程序(在部署时或任何时候)要使用哪个数据源 第一步:将persistence.xml中特定于容器的JNDI名称替换为特定于应用程序的名称。在部署时,应用程序特定的名称需要绑定到容器特定的名称 问题:据我所知,使用persistence.xml进行引用是不可能的,除非您禁用实体增强功能,从而降低性能,除非我完全误解了它。(来源:) 其次,我发现没有办法在EAR级别上执行资源引用,我猜必须在application.xml中执行,这是在我的maven生成的示例中,因此我必须在POM中执行,但不知道如何执行,EJB插件的引用没有提及 但也许我只是走错了方向。任何帮助都将不胜感激 更新-2014-09-12:从POM.xml中删除application.xml的自动生成,并将Jakarta ee 在同一服务器上使用不同的数据源多次部署EAR,jakarta-ee,jpa,jndi,wildfly,Jakarta Ee,Jpa,Jndi,Wildfly,让我们假设一个JavaEE6应用程序打包为一个EAR(一个EJB-JAR、N个web模块和一些库),使用JPA实现持久性 要求是,在一台机器上需要运行多个客户的应用程序。每个客户都有自己的数据库 现在的问题是,您在哪里为每个客户配置数据源,以及如何告诉应用程序(在部署时或任何时候)要使用哪个数据源 第一步:将persistence.xml中特定于容器的JNDI名称替换为特定于应用程序的名称。在部署时,应用程序特定的名称需要绑定到容器特定的名称 问题:据我所知,使用persistence.xml进
添加到application.xml中,将数据源的本地JNDI名称映射到特定的容器。(这让我非常高兴。)
jdbc/客户alpha
javax.sql.XADataSource
java:jboss/datasources/customer alpha
我仍然不确定人们是否真的会这样做。还有一些其他问题,但会分别询问,例如,谁会将映射添加到application.xml,何时,部署此类应用程序的工作流是什么
-
Martin我意识到这个问题有点过时,但我只想指出财产置换功能: 从我所读到的内容(没有对它进行测试——但是对其他情况进行了测试),您应该能够将其应用于persistence.xml 因此,基本上您可以设置一个具有jndi名称的系统属性,用于应用程序的给定实例,并在persistence.xml中引用该属性
这意味着您不需要开始触摸耳朵,同时启用每个客户的特定性。为什么不为每个web应用程序简单地分离EJB?@pmp我想我不明白。问题不在于多个web模块,而在于它是EAR而不是战争的原因。问题是运行此EAR的多个实例,每个实例具有不同的数据源,需要在部署时将这些实例放入persistence.xml中。因此,在这种情况下,定义多个持久性单元,并且需要相同数量的会话bean,以便每个会话bean与一个持久性单元交互。在每个web模块内部注入适当的会话bean。或者,您可以有多个持久化单元和一个通用表(一个简单的映射表,用于确定web模块应该与持久化单元交互),该表确定您应该与哪个表交互。每当您需要调用EntityManager时,首先查找此常规表并获取相应的实体管理器。
<resource-ref>
<res-ref-name>jdbc/customer-alpha</res-ref-name>
<res-type>javax.sql.XADataSource</res-type>
<lookup-name>java:jboss/datasources/customer-alpha</lookup-name>
</resource-ref>