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
Jakarta ee 在同一服务器上使用不同的数据源多次部署EAR_Jakarta Ee_Jpa_Jndi_Wildfly - Fatal编程技术网

Jakarta ee 在同一服务器上使用不同的数据源多次部署EAR

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进

让我们假设一个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的自动生成,并将
添加到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>