java - 在 Wildfly 中使用多个数据源

标签 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. 只有在 <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/

    相关文章:

    java - 哪些工具可用于将测试数据填充到 mongodb

    java - 从周数中获取 Joda Time 的日期名称

    java 堆栈溢出错误

    java - 如何检查 Java EE 应用程序中的数据库连接泄漏?

    jboss - 在 Linux FileNotFoundException 上启动 Wildfly 10 时出错

    java - 如何获取 JCheckBoxMenuItem 的 boolean 值?

    java - 多次使用准备好的语句是否资源安全?

    java - SQL语句对象在哪些情况下会自动关闭?

    java - Web 服务接口(interface)在哪里?

    java - Spring Framework 过滤器,未注入(inject) bean