我在我的 Java Web 应用程序中使用多个数据源。 这是 Wildfly 配置(独立模式):
<datasource jta="false" jndi-name="java:jboss/datasources/DS1" pool-name="DS1" enabled="true" use-ccm="false">
<connection-url>URL1</connection-url>
<driver>ojdbc7</driver>
<security>
<user-name>login</user-name>
<password>password</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</datasource>
<datasource jta="false" jndi-name="java:jboss/datasources/DS2" pool-name="DS2" enabled="true" use-ccm="false">
<connection-url>URL2</connection-url>
<driver-class>org.h2.Driver</driver-class>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
我的 ejb 子项目中的 Jboss.xml:
<session>
<ejb-name>Bean1</ejb-name>
<resource-description>
<res-ref-name>DS1</res-ref-name>
<jndi-name>java:jboss/datasources/DS1</jndi-name>
</resource-description>
</session>
<session>
<ejb-name>Bean2</ejb-name>
<resource-description>
<res-ref-name>DS2</res-ref-name>
<jndi-name>java:jboss/datasources/DS2</jndi-name>
</resource-description>
</session>
在 EJB Bean1/Bean2 数据源中通过
调用@Resource(name="DS1/DS2")
private DataSource dataSource;
....
Connection connection = dataSource.getConnection();
使用所示配置我遇到了以下问题:
只有在
<default-bindings>
中将数据源设置为默认值时,我才能访问数据源我的standalone-full.xml 的部分。如果它是空的,我得到"JBAS014771: Services with missing/unavailable dependencies"
指向部署期间 bean 中使用的数据源列表。
如果我将 DS1 设置为默认值,下次注入(inject) DS2 时,它将包含
LocalManagedConnectionFactory
指向 dataSource.mcf 变量中的 DS1
正如我从这个主题中了解到的 Why different persistence units with separated data sources query the same data source? 此问题可能是由容器管理的持久性引起的。
但在给定的情况下,我没有使用任何 ORM。所以我只能使用 jndi 和服务器配置来操作数据源。
那么有什么方法可以通过使用一些额外的 Wildfly 配置/对应用程序进行任何操作来解决这种情况,或者我必须使用 ORM 并自己管理持久性?
感谢您的回复。
最佳答案
建议使用 ORM(最好是 JPA),因此您将使用entityManager 和 persistence.xml 来使用多个数据源。
<persistence-unit name="DB1_PU">
<jta-data-source>java:jboss/datasources/ds1</jta-data-source>
</persistence-unit>
<persistence-unit name="DB2_PU">
<jta-data-source>java:jboss/datasources/ds2</jta-data-source>
</persistence-unit>
您可以这样调用 DS:
@PersistenceContext(unitName = "DB1_PU")
protected EntityManager entityManager1;
@PersistenceContext(unitName = "DB2_PU")
protected EntityManager entityManager2;
关于java - 在 Wildfly 中使用多个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33483601/