2009-08-03 17 views
8

Używam w mojej aplikacji miksu Wiosna/Hibernacja (nic oryginalnego). W przypadku danej funkcji muszę zaimportować zawartość pliku CSV do tabeli mojej bazy danych Oracle. Na razie juste tworzyć obiekty, robięWkładki luzem ze sprężyną/hibernacji

HibernateTemplate.saveOrUpdate 

na każdej z nich (muszę odzyskać ich nowo przydzielone ID)

wówczas transakcja nastąpi pod koniec tej metody, za pomocą Wiosenny interfejs API.

Wszystko działa poprawnie, oprócz wydajności, który jest właściwy dla około 5000 w obiektach, ale nie na 100 000 ...

Więc szukam pomysłów, aby przyspieszyć ten materiał. Słyszałem o wstawkach zbiorczych z Hibernate, ale nie mogłem znaleźć żadnego stałego odniesienia. Czy ktoś może mi podać kilka pomysłów na wykonanie tego importu z większą wydajnością?

+1

Nie oznacza to, że jesteś palantem, ale dokumentacja jest dość zwięzła i zajmuje tylko 5 minut: http://docs.jboss.org/hibernate/stable/core/reference/en/html /batch.html – Tim

+0

Dziękuję za link, którego dokładnie szukałem. Zrobiłem kilka badań wcześniej i nie znalazłem go, ale jestem początkującym w kwestii kopiowania dokumentacji Hibernate. –

Odpowiedz

7

Coś prostego można spróbować jest przepłukać i oczyścić sesję powiedzieć co 100 obiektów ...

więc wykonać

session.flush(); 
session.clear(); 

co 100 lub 1000 insertów.

Spowoduje to przepłukanie i wyczyszczenie sesji hibernacji i zatrzymanie jej zwiększania się (prawdopodobnie dlatego, że twoje 100 000 obiektów zajmuje tak dużo czasu).

Ponadto, jeśli używasz identyfikatora identyfikatora, funkcja hibernacji spowoduje ciche wyłączenie wstawiania wsadowego. Wstawianie wsadowe poprawi wydajność. Trzeba również określić właściwość konfiguracyjną hibernate.jdbc.batch_size, równoważną twojemu 100 na raz.

Źródłem tego była oprawa Java firmy Manning z Hibernate (świetna książka - wielokrotnie zapisywała mi skórę).

6

Można również rozważyć użycie StatelessSession, ponieważ jest przeznaczony do operacji zbiorczych.

StatelessSession ss=sessionFactory().openStatelessSession(); 
Transaction tx=ss.beginTransaction(); 
+1

link jest nieprawidłowy: https://www.hibernate.org/hib%5Fdocs/v3/api/org/hibernate/StatelessSession.html –

+0

oba linki są teraz błędne. tutaj jest nowy link: http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/StatelessSession.html – Isaac

3

Czasami ORMapper nie jest właściwym młotkiem dla gwoździa. Szczególnie operacje wsadowe są często bardziej wydajnie wykonywane przy użyciu zwykłego starego JDBC. To oczywiście zależy od różnych warunków, ale powinieneś przynajmniej zobaczyć to jako opcję i porównać wydajność obu podejść.

0

To nie jest czysto problem z wydajnością wkładania bazy danych; jeśli tworzysz dziesiątki tysięcy obiektów i nie wykonasz spłukiwania, sesja hibernacji będzie rosnąć, aż zabraknie pamięci.

Powiązane problemy