2017-03-17 3 views
0

Ich habe ein Setup, bei dem ich OpenEntityManagerInViewFilter verwenden, um nicht transaktionale Lesevorgänge aus meiner Datenbank zu aktivieren. Um diese Lesevorgänge an einen Slave in einer Master/Slave-Konfiguration zu senden, setze ich meinen Verbindungspool so, dass er Verbindungen standardmäßig auf schreibgeschützt setzt. Mein Problem ist jetzt, dass selbst die mit @Transactional markierten Methoden Lese-Schreib-fähig sind, die Verbindung nicht auf Lesen-Schreiben eingestellt ist und die Transaktion an einen Nur-Lese-Server gesendet wird. Ist dies das erwartete Verhalten im Frühling und/oder wie kann ich das beheben?Spring transaction nicht Einstellung der Verbindung readOnly false

+0

Wir verwenden eine spezielle Annotation, um zwischen Datenquellen zu wechseln: Master/Slave für Situationen wie diese und Nur-Lese-Attribut für Transaktionsannotation, wir tun keine Standardwerte für einen Pool, obwohl es möglich ist für Slave-Datenquelle – borowis

+0

Wie haben Sie festgelegt der Verbindungspool zu "schreibgeschützt" und welche Txn-Isolation wird verwendet? – sura2k

+0

@ sura2k HikariCP hat eine HikariDataSource.setReadOnly und ich verwende die Standard-Isolationsstufe für innodb (wiederholbares Lesen). –

Antwort

0

Mit dem gleichen Problem konfrontiert, obwohl ich das schreibgeschützte Flag im CP30-Pool standardmäßig auf true gesetzt habe. Sie können dies über die ConnectionCustomizer-Schnittstelle tun.

Ich nehme an, dass die Feder annimmt, dass der Standard-Nur-Lese-Wert falsch ist, also keine Änderungen daran vornimmt. Siehe DataSourceUtils.prepareConnectionForTransaction

Weiß nicht, ob dies als ein Fehler ausgelöst werden sollte.

Verwandte Themen