我们可以有多个dataSources到单个数据库

时间:2015-05-07 07:13:56

标签: java spring oracle jpa jdbc

我正在使用oracle作为数据库的spring webservice应用程序。现在我有使用weblogic服务器创建的数据源。还使用eclipse linkg JPA来执行读写事务(插入,读取和更新)。现在我们想要将dataSource分开用于读取(读取)和wrtie(插入或更新)事务。

我当前的dataSource如下:

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

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

如果我执行以下操作该怎么办:

transactionManagers

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

:: UPDATE ::

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

我采用了多种数据库方法。您将在其中定义多个managerFactoryEntityManagerFactory。我只采用了org.springframework.transaction.jta.WebLogicJtaTransactionManager Bean中的单个非xa dataSource(JNDI)。

您可以在此处转发以下链接,这些链接适用于多个dataSources Multiple DataSource Approach defining @transactional value

还在事务管理器org.springframework.orm.jpa.JpaTransactionManageruuid_break上进行了探讨。

4 个答案:

答案 0 :(得分:0)

Spring文档中有一篇有趣的文章 - Dynamic DataSource Routing。这里有一个例子,它允许您在运行时基本上切换数据源。它应该对你有所帮助。如果您有任何更具体的问题,我很乐意帮助您。

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

答案 1 :(得分:0)

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

以下是指向服务的Oracle数据库文档的指针: https://docs.oracle.com/database/121/ADMIN/create.htm#CIABBCAI

答案 2 :(得分:0)

如果您正在使用spring,那么您应该能够在@Transactional属性设置为true的情况下通过spring readonly使用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 :(得分:0)

我很确定您需要解决数据库/连接url +属性层上的问题。 我会谷歌周围的东西,如读写复制。

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