2015-05-07 15 views
5

Sto avendo un'applicazione web server con Oracle come database. In questo momento ho origine dati creati usando il server weblogic. Anche usando eclipse linkg JPA per fare entrambe le operazioni di lettura e scrittura (inserisci, leggi e aggiorna). Ora vogliamo separare dataSources per le transazioni read (read) e wrtie (insert o update).Possiamo avere più origini dati per il singolo database

mio dataSource corrente è come segue:

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

utilizzo di questo, sto facendo entrambe le operazioni di lettura e scrittura.

Che cosa succede se faccio la seguente:

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 

sapevo che utilizza XA origine dati che possiamo definire più origini dati. Posso fare la stessa cosa senza XA dataSource. Qualcuno ha provato questo tipo di approccio.

:: AGGIORNAMENTO ::

Grazie a tutti per le vostre risposte ho implementato seguente soluzione.

Ho preso l'approccio di database multipli. dove definirai più transactionManagers e managerFactory. Ho preso solo single non xa dataSource (JNDI) che è referenziato nel bean EntityManagerFactory.

è possibile Reefer seguenti link qui che sono per più origini dati Multiple DataSource Approach defining @transactional value

esplorati anche sui gestori di transazioni org.springframework.transaction.jta.WebLogicJtaTransactionManager e org.springframework.orm.jpa.JpaTransactionManager pure.

risposta

0

C'è un articolo interessante su questo documento in primavera - Dynamic DataSource Routing. C'è un esempio lì, che ti permette di cambiare sostanzialmente le origini dati in fase di runtime. Dovrebbe aiutarti. Sarei lieto di aiutarti di più, se hai altre domande specifiche.

EDIT: Indica che l'uso effettivo è quello di avere una connessione a più database tramite una configurazione, ma si potrebbe riuscire a creare diverse configurazioni su un database con parametri diversi, come avresti bisogno.

+0

domanda veloce, proprietà URL definita differentemente per oro, argento e bronzo. jdbc: HSQLDB: hsql: // localhost: $ {} db.port.gold/blog. Nel mio caso, se uso la stessa cosa, ha qualche problema. Inoltre sto usando EclipseLink come mio JPA. Lascia che esegua questo approccio prima. – user1268890

+0

Basta creare un Enum con le proprietà READ e WRITE, potrebbe funzionare allo stesso modo. Fornisci le proprietà richieste, di cui hai bisogno. Non penso che ci sarebbero alcuni problemi aggiuntivi riguardo al provider JPA. – user

0

Suggerirei di utilizzare i "servizi" del database. Ogni carico di lavoro, di sola lettura e di lettura-scrittura, utilizzerebbe il proprio servizio per accedere al database. In questo modo puoi utilizzare i rapporti AWR per ottenere le statistiche per ciascun servizio. È inoltre possibile disattivare la lettura e scrittura quando si mantiene la lettura sola e attiva.

Ecco un puntatore alla documentazione Oracle Database che parla di servizi: https://docs.oracle.com/database/121/ADMIN/create.htm#CIABBCAI

0

Se stai usando primavera, si dovrebbe essere in grado di raggiungere questo obiettivo senza utilizzare 2 Datasources via primavera @Transactional con il set di proprietà readonly al vero Il motivo per cui suggerisco questo è che sembri preoccupato solo della transazionalità e questo sembra essere previsto nel contesto primaverile?

Io suggerirei qualcosa di simile per il vostro caso:

@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 
    } 
} 

Utilizzando questo stile, si dovrebbe essere in grado di dividere leggere solo i servizi dalle loro controparti di scrittura, o addirittura hanno leggere e scrivere metodi di servizio combinato. Ma entrambi non usano 2 datasource.

Codice è dal Spring Reference

0

Sono abbastanza sicuro che è necessario affrontare il problema sul livello di database/collegamento url + proprietà. Vorrei google in giro per qualcosa come leggere la replica di scrittura.

Correlato alla domanda con JPA e transazione. Sei condannato quando utilizzi più origini dati. Anche le origini dati XA non sono realmente una soluzione per questo. L'unica cosa che fanno per te è garantire la coerenza su operazioni con più sorgenti di dati. Transazioni XA eseguono solo una sorta di transazione logica su due transazioni (una per ogni origine dati). Dal punto di vista dell'isolamento della transazione (purché non si utilizzi READ_UNCOMMITED), entrambe le origini dati utilizzano la propria transazione. Ciò significa che l'origine dati letta non vedrebbe le modifiche apportate dalla transazione di scrittura.

Problemi correlati