2015-05-07 119 views
5

我有一个以oracle为数据库的spring webservice应用程序。现在我有使用weblogic服务器创建的数据源。还使用eclipse linkg JPA来执行读取和写入事务(插入,读取和更新)。现在我们要分开dataSources以读取(读取)和wrtie(插入或更新)事务。我们可以有多个数据源到单个数据库吗

我目前的数据源是如下:使用此

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数据源的情况下做同样的事情吗?有没有人尝试过这种方法?

::更新::

谢谢大家的回答,我已经实现了以下解决方案。

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

,你可以在这里冷藏箱以下链接它们是多个数据源 Multiple DataSource Approach defining @transactional value

上的事务管理器org.springframework.transaction.jta.WebLogicJtaTransactionManagerorg.springframework.orm.jpa.JpaTransactionManager还探讨为好。

回答

0

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

编辑:它告诉,实际使用是通过一个配置连接到多个数据库,但你可以设法创建不同的配置到一个数据库与不同的参数,因为你需要。

+0

quick问题,URL属性定义为金,银,铜等不同。 JDBC:HSQLDB:HSQL://本地主机:$ {} db.port.gold /博客。在我的情况下,如果使用相同的东西,它有任何问题。另外我使用EclipseLink作为我的JPA。让我先执行这个方法。 – user1268890

+0

只需创建一个具有READ和WRITE属性的Enum,它可以以相同的方式工作。根据需要提供所需的属性。我不认为会有关于JPA提供者的其他问题。 – user

0

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

这里是一个指针,谈到了服务的Oracle数据库文档:通过弹簧@Transactionalreadonly属性集 https://docs.oracle.com/database/121/ADMIN/create.htm#CIABBCAI

0

如果你使用Spring,你应该能够做到这一点,而无需使用数据源2为真。我提出这个建议的原因是你似乎只关心事务性,这似乎是在春季框架中照顾的?

我建议这样的事情对你的情况:

@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

0

我敢肯定,你需要解决的数据库/连接URL +性质层上的问题。 我会谷歌周围的东西像读写复制。

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

相关问题