【问题标题】:Can we have multiple dataSources to single database我们可以有多个数据源到单个数据库吗
【发布时间】:2015-07-17 14:58:03
【问题描述】:

我正在使用以 oracle 作为数据库的 spring webservice 应用程序。现在我已经使用 weblogic 服务器创建了数据源。还使用 eclipse linkg JPA 来执行读写事务(插入、读取和更新)。现在我们要分离读取(读取)和写入(插入或更新)事务的数据源。

我目前的dataSource如下:

JNDI NAME : jdbc/POI_DS
URL : jdbc:oracle:thin:@localhost:1521:XE

使用它,我正在执行读写事务。

如果我执行以下操作会怎样:

JNDI NAME : jdbc/POI_DS_READ
URL : jdbc:oracle:thin:@localhost:1521:XE

JNDI NAME : jdbc/POI_DS_WRITE
URL : jdbc:oracle:thin:@localhost:1521:XE

我知道使用 XA 数据源我们可以定义多个数据源。我可以在没有 XA 数据源的情况下做同样的事情吗?有没有人尝试过这种方法。

::UPDATE::

感谢大家的回复,我已经实施了以下解决方案。

我采用了多数据库方法。您将在其中定义多个transactionManagersmanagerFactory。我只采用了EntityManagerFactory Bean 中引用的单个非 xa 数据源(JNDI)。

您可以在此处冷藏以下链接,这些链接适用于多个数据源 Multiple DataSource Approach defining @transactional value

还探讨了事务管理器org.springframework.transaction.jta.WebLogicJtaTransactionManagerorg.springframework.orm.jpa.JpaTransactionManager

【问题讨论】:

    标签: java spring oracle jpa jdbc


    【解决方案1】:

    我很确定您需要解决数据库/连接 url + 属性层的问题。 我会在谷歌上搜索诸如读写复制之类的东西。

    与您对 JPA 和事务的问题有关。当您使用多个数据源时,您注定要失败。 XA 数据源也不是真正的解决方案。他们为您做的唯一一件事就是确保多数据源操作的一致性。 XA Transaction 仅跨越两个事务(每个数据源一个)的某种逻辑事务。从事务隔离的角度来看(只要您不使用 READ_UNCOMMITED),两个数据源都使用自己的事务。这意味着读取数据源不会看到写入事务所做的更改。

    【讨论】:

      【解决方案2】:

      如果您使用的是 spring,您应该能够通过 spring @Transactionalreadonly 属性设置为 true 来完成此操作而无需使用 2 个数据源。我建议这样做的原因是您似乎只关心事务性,而这似乎在 Spring 框架中得到了满足?

      我会为你的情况建议这样的事情:

      @Transactional(readOnly = true)
      public class DefaultFooService implements FooService {
      
          public Foo getFoo(String fooName) {
              // do something
          }
      
          // these settings have precedence for this method
          @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
          public void updateFoo(Foo foo) {
              // do something
          }
      }
      

      使用这种风格,您应该能够将只读服务与其写入对应物分开,甚至可以组合读取和写入服务方法。但是这两个都不使用 2 个数据源。

      代码来自Spring Reference

      【讨论】:

        【解决方案3】:

        我建议使用数据库“服务”。每个工作负载,只读和读写,都将使用自己的服务来访问数据库。这样您就可以使用 AWR 报告来获取每个服务的统计信息。您还可以在保持只读状态并运行时关闭读写。

        这里是关于服务的 Oracle 数据库文档的指针: https://docs.oracle.com/database/121/ADMIN/create.htm#CIABBCAI

        【讨论】:

          【解决方案4】:

          Spring 文档中有一篇关于此的有趣文章 - Dynamic DataSource Routing。那里有一个示例,它允许您在运行时基本上切换数据源。它应该可以帮助你。如果您有任何更具体的问题,我很乐意为您提供更多帮助。

          编辑:它告诉我们,实际用途是通过一种配置连接到多个数据库,但是您可以根据需要设法为具有不同参数的一个数据库创建不同的配置。

          【讨论】:

          • 快速问题,黄金、白银和青铜的 URL 属性定义不同。 jdbc:hsqldb:hsql://localhost:${db.port.gold}/blog。在我的情况下,如果使用相同的东西它有任何问题。我也使用 EclipseLink 作为我的 JPA。让我先执行这个方法。
          • 只需创建一个具有 READ 和 WRITE 属性的 Enum,它可以以相同的方式工作。根据需要提供所需的属性。我认为 JPA 提供者不会有其他问题。
          猜你喜欢
          • 2020-12-25
          • 1970-01-01
          • 1970-01-01
          • 2012-10-07
          • 2021-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-21
          相关资源
          最近更新 更多