我在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();
使用显示的配置我遇到了以下问题:
只有在我的standalone-full.xml的<default-bindings>
部分中将数据源设置为默认值时,才能访问数据源。如果它是空的,我会
"JBAS014771: Services with missing/unavailable dependencies"
指向部署期间bean中使用的数据源列表。
如果我将DS1设置为默认值,则下次注入DS2时,它将包含
LocalManagedConnectionFactory
指向dataSource.mcf变量中的DS1
正如我从这个主题中所理解的那样 Why different persistence units with separated data sources query the same data source? 这个问题可能是由容器管理的持久性造成的。
但在特定情况下,我没有使用任何ORM。所以我只能使用jndi和服务器配置来操作数据源。
那么有什么方法可以通过使用一些额外的wildfly配置/应用程序的任何操作来解决这种情况,或者我必须自己使用ORM并管理持久性?
感谢您的回复。
答案 0 :(得分:0)
建议使用ORM(最佳情况下为JPA),因此您将使用entityManager和persitence.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;