在Wildfly中使用多个数据源

时间:2015-11-02 17:38:11

标签: java jdbc jboss datasource wildfly

我在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();

使用显示的配置我遇到了以下问题:

  1. 只有在我的standalone-full.xml的<default-bindings>部分中将数据源设置为默认值时,才能访问数据源。如果它是空的,我会

    "JBAS014771: Services with missing/unavailable dependencies"

  2. 指向部署期间bean中使用的数据源列表。

    1. 如果我将DS1设置为默认值,则下次注入DS2时,它将包含

      LocalManagedConnectionFactory

    2. 指向dataSource.mcf变量中的DS1

      正如我从这个主题中所理解的那样 Why different persistence units with separated data sources query the same data source? 这个问题可能是由容器管理的持久性造成的。

      但在特定情况下,我没有使用任何ORM。所以我只能使用jndi和服务器配置来操作数据源。

      那么有什么方法可以通过使用一些额外的wildfly配置/应用程序的任何操作来解决这种情况,或者我必须自己使用ORM并管理持久性?

      感谢您的回复。

1 个答案:

答案 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;