2010-04-01 14 views
23

Wollte nur Ihre Expertenmeinungen zum deklarativen Transaktionsmanagement für Spring. Hier ist mein Setup:Spring - Transaktion Readonly

  1. DAO Schicht ist nur alter JDBC mit Spring JdbcTemplate (No Hibernate etc.)
  2. Dienstschicht ist POJO mit deklarativen Transaktionen wie folgt - save*, readonly = false, rollback for Throwable

Dinge funktionieren gut mit über dem Setup. Aber wenn ich sage get*, readonly = true, sehe ich Fehler in meiner Protokolldatei sagen Database connection cannot be marked as readonly. Dies geschieht für alle get * -Methoden in der Serviceebene.

Nun meine Fragen sind:

A. Muss ich get* als nur lesbar gesetzt haben? Alle meine get* Methoden sind reine Lese-DB-Operationen. Ich möchte sie in keinem Transaktionskontext ausführen. Wie ernst ist der obige Fehler?

B. Wenn ich die get* Konfiguration entferne, sehe ich die Fehler nicht. Außerdem werden alle meine einfachen get* Operationen ohne Transaktionen ausgeführt. Ist das der Weg zu gehen?

C. Warum sollte jemand transaktionale Methoden haben wollen, wo readonly = true? Gibt es eine praktische Bedeutung dieser Konfiguration?

Vielen Dank! Wie immer werden Ihre Antworten sehr geschätzt!

Antwort

23

This post teilt mit, dass das Verhalten oder das readOnly Flag persistence-Mechanismus-abhängig ist.

C. Ja, wenn Hibernate verwenden, gibt es Leistungsvorteile durch den Flush-Modus FLUSH_NEVER Einstellung (wie im verlinkten Beitrag beschrieben)

B. Ja, JDBC Anrufe benötigen keine Transaktion (Für den Ruhezustand ist eine erforderlich.) Durch Entfernen der @Transactional-Konfiguration wird also die gesamte Transaktionsverwaltung gekürzt.

A. ich Frühling annehmen würde ruft connection.setReadOnly(true) aber Ihre JDBC-Treiber dies nicht unterstützt

Die Bottom-Line ist: nicht readonly Transaktionen mit einfachen JDBC verwenden.

Und eine andere Sache - Transaktionen sollen mehrere Abfragen umfassen. Machen Sie Ihre Transaktionen nicht zu feinkörnig. Machen Sie sie a unit of work.

+0

Vielen Dank Bozho! Klar als Tag. Ich denke, ich werde die get * -Konfiguration entfernen, da ich einfach JDBC verwende. – AAK

+1

Ohne eine schreibgeschützte Transaktion öffnen Sie sich auch für die gefürchtete 'org.hibernate.LazyInitializationException'. – HDave

+0

In welcher Weise kann ich org.hibernate.LazyInitializationException vermeiden, während der Waffle-Authentifizierungsmanager angezeigt wird. –

5

A. Muss ich sagen * als Readonly erhalten? Alle meine get * -Methoden sind reine DB-Operationen. Ich möchte sie in keinem Transaktionskontext ausführen. Wie ernst ist der obige Fehler?

Eigentlich wollen Sie wahrscheinlich immer noch alle Ihre get() s im Rahmen einer Transaktion ausgeführt werden, um sicherzustellen, dass Sie werden immer konsistent liest. Wenn Ihnen das jedoch egal ist, können Sie die Transaktionsebene entsprechend einstellen.

C. Warum sollte jemand transaktionale Methoden haben wollen, wo readonly = true? Gibt es eine praktische Bedeutung dieser Konfiguration?

  1. Um innerhalb get() `Methoden
  2. Zur Optimierung gegen verirrten schreibt zu schützen. Hibernate kann nicht nur diese Informationen nutzen, wie Bozho erwähnt hat, sondern auch einige Datenbanken/JDBC-Treiber können diese Informationen nutzen.
+0

Vielen Dank Matt! Ich denke, meine Methoden sind ziemlich einfach, unabhängige SQL Select-Abfragen und ich verwende nicht Hibernate, also werde ich die Einstellung deaktivieren. – AAK

Verwandte Themen