2015-11-20 17 views
5

Jestem w trakcie optymalizacji algorytmu i zauważyłem, że Hibernate tworzy i wyrzuca powtórnie instrukcje aktualizacji, zamiast ich ponownie używać. Wszystkie są z tego samego zapytania.Wiosenna hibernacja, unikaj instrukcji rejestrowania i zamykania powtarzalnie

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] 

Główną metodą algorytmu zawiera się @Scope i @Transactional adnotacji. Oczekiwane zachowanie jest takie, że jeśli coś pójdzie nie tak, aktualizacje algorytmu są następujące: ROLLBACK.

Pod algorytm wykorzystuje @Service który ma inny @Scope i jest także @Transactional. Ta usługa korzysta z oprogramowania Hibernate w celu aktualizacji bazy danych za pomocą session.update(entity). Dokumentacja mówi, że domyślnie transakcje zagnieżdżone ponownie wykorzystują transakcję, jeśli istnieje.

  • Czy to potwierdzenie powyżej jest prawidłowe?
  • Czy zmiana zakresu może powodować problemy?
  • W jaki sposób mogę ponownie wykorzystać komunikat Hibernuj podczas transakcji?

Dzięki za uwagę

Odpowiedz

5

Twoje rozumienie jest poprawne. Zakres nie jest związany z propagowaniem transakcji, Spring powinien owijać komponenty bean serwerami proxy kontrolującymi transakcje niezależnie od zakresu.

Nie ma możliwości ponownego użycia instrukcji podczas korzystania z trybu hibernacji. Nawet przy ręcznym pisaniu kodu JDBC nie jest zalecane podejście, ze względu na uwikłanie kodu, które takie podejście wymusza. Powszechną odpowiedzią na to jest użycie przygotowanej pamięci podręcznej instrukcji na puli połączeń JDBC. Na przykład z pulą Apache DBCP można użyć kontrolek poolPreparedStatements i maxOpenPreparedStatements. Pule w pakiecie z serwerami aplikacji mają podobne ustawienia.