2010-07-19 14 views
8

Grazie per aver letto questo.Spring: origine dati separata per transazioni di sola lettura

Ho 2 database MySQL: master per scritture, slave per letture. Lo scenario perfetto che immagino è che la mia app utilizzi la connessione al master per le transazioni readOnly=false, slave per le transazioni readOnly=true.

Per implementare questo ho bisogno di fornire una connessione valida a seconda del tipo di transazione corrente. Il mio livello di servizio dati non dovrebbe sapere quale tipo di connessione utilizza e usare solo l'iniettato SqlMapClient (io uso iBatis) direttamente. Ciò significa che (se ho capito bene) gli iniettati SqlMapClient devono essere inoltrati e il delegato deve essere scelto in fase di runtime.

public class MyDataService { 

    private SqlMapClient sqlMap; 

    @Autowired 
    public MyDataService (SqlMapClient sqlMap) { 
     this.sqlMap = sqlMap; 
    } 

    @Transactional(readOnly = true) 
    public MyData getSomeData() { 
     // an instance of sqlMap connected to slave should be used 
    } 

    @Transactional(readOnly = false) 
    public void saveMyData(MyData myData) { 
     // an instance of sqlMap connected to master should be used 
    } 
} 

Quindi la domanda è: come posso fare questo?

Grazie mille

risposta

4

E 'un'idea interessante, ma devi avere un lavoro duro sulle vostre mani. L'attributo readOnly è inteso come suggerimento per il gestore delle transazioni e non è realmente consultato in nessun altro luogo. Dovresti riscrivere o estendere più classi dell'infrastruttura Spring.

Quindi, a meno che non siate decisi a far funzionare questo lavoro, l'opzione migliore è quasi sicuramente iniettare due oggetti separati SqlMapClient nel DAO e scegliere i metodi appropriati. Le annotazioni @Transactional dovrebbero anche indicare quale gestore transazioni utilizzare (supponendo che si stia utilizzando DataSourceTransactionManager anziché JpaTransactionManager), facendo attenzione a far corrispondere il gestore transazioni allo DataSource utilizzato dallo SqlMapClient.

+0

C'è un modo più semplice con AspectJ per esempio? – artemb

+0

@artemb: Sono sicuro che AspectJ sarebbe stato d'aiuto, ma non sarà ancora facile. – skaffman

Problemi correlati