2015-11-20 2 views
5

Ich bin dabei, einen Algorithmus zu optimieren, und ich habe festgestellt, dass Hibernate wiederholt Update-Anweisungen erstellt und veröffentlicht, anstatt sie wieder zu verwenden. Diese stammen alle aus derselben Abfrage.Spring Hibernate, zu vermeiden, dass Anweisungen registrieren und schließen wiederholt

15:57:31,589 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,591 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,594 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,595 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,597 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,599 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,600 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,601 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 

die wichtigste Methode des Algorithmus hat eine @Scope und einen @Transactional Annotation. Das erwartete Verhalten ist, dass, wenn etwas schief geht, die Updates des Algorithmus ROLLBACK sind.

Darunter verwendet der Algorithmus eine @Service, die eine andere @Scope hat und auch @Transactional ist. Der Dienst verwendet Hibernate, um die Datenbank mit session.update(entity) zu aktualisieren. Die Dokumentation besagt, dass verschachtelte Transaktionen die Transaktion standardmäßig wiederverwenden, wenn sie vorhanden ist.

  • Ist diese Bestätigung oben korrekt?
  • Kann der Umfang Änderung Probleme verursachen?
  • Wie kann ich Hibernate die Anweisung während der Transaktion wiederverwenden?

Vielen Dank für Ihre Aufmerksamkeit

Antwort

5

Ihr Verständnis ist richtig. Der Bereich bezieht sich nicht auf die Propagierung von Transaktionen. Spring sollte Ihre Beans mit Proxys umschließen, die Transaktionen unabhängig vom Bereich steuern.

Es gibt keine Möglichkeit, Anweisungen wiederzuverwenden, wenn Sie Hibernate verwenden. Selbst wenn JDBC-Code manuell geschrieben wird, ist es aufgrund der Verschränkung von Code, die eine solche Annäherung erzwingt, nicht empfehlenswert, sich anzunähern. Eine allgemeine Antwort darauf ist die Verwendung des vorbereiteten Anweisungscaches im JDBC-Verbindungspool. Zum Beispiel mit Apache DBCP Pool können Sie poolPreparedStatements und maxOpenPreparedStatements verwenden, um das zu kontrollieren. Pools, die mit Anwendungsservern gebündelt sind, haben ähnliche Einstellungen.

Verwandte Themen