2017-04-25 6 views
2

Ich arbeite in einer Spring, Java, Hibernate, PostgreSQL Umgebung. Ich sehe eine ziemlich schwere Langsamkeit in meiner Datenbank. Meine spezifische Frage ist, wie schlecht es ist, wenn ich Spring @Transactional Annotation zu einer Klasse hinzufüge, die Methoden enthält, die die Datenbank nicht treffen? Mit anderen Worten, sie erfordern keine Transaktion. Angenommen, diese Methoden gehören zu den am häufigsten verwendeten Methoden.Unnötige Datenbanktransaktionen verursachen Langsamkeit?

So etwas wie dieses (nur ein Beispiel):

@Component 
@Transactional 
public class ProjectManager { 

    public String getProjectUrl(Project project) { 
     //simple logic that does not use the database 
     return "/my/url/" + project.getId(); 
    } 

} 

Ich verstehe es viele Faktoren gibt, die Datenbank Langsamkeit verursachen kann. Ich frage mich nur, ob das eine riesige rote Flagge ist oder nicht so groß von einem Deal? Sollte ich diese Methoden herausziehen und in eine andere Klasse legen, die nicht mit @Transactional gekennzeichnet ist?

TIA

+0

Haben Sie irgendwelche Benchmarks für diese Methode mit und ohne die '@ Transactional' Annotation? –

+1

* "Wie schlimm ist es, wenn ich die' 'Transactional' Annotation von Spring hinzufüge" * Sehr wenig, es sei denn, Sie haben den Code profiliert, der besagt, dass Sie dort ein Problem haben, und ich bezweifle es. – Andreas

+0

Ich bin nicht 100% sicher, ob es helfen wird, aber [hier] (http://blog.jhades.org/how-does-spring-transactional-really-work/) können Sie eine Erklärung finden was genau passiert, wenn Sie '@ Transactional' verwenden – saljuama

Antwort

4

Zu allererst Ihre getProjectUrl Methode wird mit Feder Aspekt abgefangen werden, dass:

  1. Transaktion erstellt bei Bedarf
  2. Ihre Methode Ruft
  3. schließt Transaktion

Dies ist gut beschrieben unter spring docs. Außerdem ist Spring nicht intelligent genug, um zu verstehen, dass der Methodencode überhaupt keine DB verwendet (as we see see in source).

So können wir definitiv zu dem Schluss kommen, dass die @Transactional von Spring einige Overhead verursacht.

Aber welche Art von Overhead?

  • Java in jedem Fall - Aspect Code implementiert sowieso
  • Je nach propagation Wert von @Transactional können wir physikalische (DB) Transaktion zu schaffen gezwungen werden. Dies verursacht Netzwerk + Verbindung + db-Side-Overhead.

Von anderer Seite, wenn Sie @Transactional entfernen, sollten Sie auch wissen, dass Postgres ANY nicht transaktionalen SQL-Abfrage in impliziten Transaktions (docs) wickelt:

PostgreSQL tatsächlich behandelt jede SQL-Anweisung als innerhalb einer Transaktion ausgeführt werden. Wenn Sie keinen BEGIN-Befehl ausgeben, hat jede einzelne Anweisung einen impliziten BEGIN und (falls erfolgreich) COMMIT um sie herum.

Schließlich die Antwort: Verwenden Sie nicht @Transactional, wenn Ihre Methode nicht mit DB zu tun hat.

Verwandte Themen