2010-07-19 9 views
8

Vielen Dank für das Lesen.Spring: separate Datenquelle für schreibgeschützte Transaktionen

Ich habe 2 MySQL-Datenbanken - Master für schreibt, Slave für liest. Das perfekte Szenario, das ich mir vorstelle, ist, dass meine App Verbindung zum Master für readOnly=false Transaktionen, Slave für readOnly=true Transaktionen verwendet.

Um dies zu implementieren, muss ich eine gültige Verbindung abhängig von der Art der aktuellen Transaktion bereitstellen. Meine Data-Service-Schicht sollte nicht wissen, welche Art von Verbindung es verwendet und nur die injizierten SqlMapClient (ich verwende iBatis) direkt verwenden. Dies bedeutet, dass (wenn ich es richtig verstanden habe) die injizierten SqlMapClient s Proxy und der Delegat sollte zur Laufzeit gewählt werden.

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

Die Frage ist also - wie kann ich das tun?

Vielen Dank

Antwort

4

Es ist eine interessante Idee, aber Sie würden einen harten Job an den Händen haben. Das readOnly Attribut ist als Hinweis für den Transaktionsmanager gedacht und wird nirgendwo sinnvoll konsultiert. Sie müssten mehrere Spring-Infrastrukturklassen neu schreiben oder erweitern.

Also, wenn Sie nicht höllisch darauf bedacht sind, diese Arbeit zu bekommen, die Sie wollen, ist Ihre beste Option fast sicher, zwei separate SqlMapClient Objekte in Ihr DAO zu injizieren, und für die Methoden, um die passende auszuwählen. Die @Transactional Annotationen müssten auch angeben, welcher Transaktionsmanager verwendet werden soll (vorausgesetzt, Sie verwenden DataSourceTransactionManager anstelle von JpaTransactionManager), wobei darauf geachtet wird, dass der Transaktionsmanager dem DataSource entspricht, der von SqlMapClient verwendet wird.

+0

Gibt es einen einfacheren Weg mit AspectJ zum Beispiel? – artemb

+0

@artemb: Ich bin sicher, AspectJ würde helfen, aber es wird immer noch nicht einfach sein. – skaffman

Verwandte Themen