2009-07-30 13 views
5

Używam Hibernate wspieranego JPA jako mojej warstwy trwałości. Mam wielowątkowy proces, który agreguje dane z wywołania Soap, a następnie przechowuje wiersz w bazie danych. Proces zwykle kończy się wstawieniem około 700 rzędów i zajmuje około 1-3 godzin, a głównym problemem jest wywołanie Soap.Jak zapobiec blokowaniu tabeli bazy danych przez inserty JPA?

Podczas tego całego procesu tabela, którą wstawiam, blokuje się i nie zwróci instrukcji select w odpowiednim czasie.

Oto błąd serwera SQL:

Error Message: Lock request time out period exceeded.

Jak uniknąć blokowania mój tabeli bazy danych podczas tego długiego procesu?

Odpowiedz

1

Czy wstawiasz wszystkie 700 wierszy z transakcją w tej samej?

Gdzie jest granica transakcji? Jeśli mógłbyś obniżyć swoją granicę transakcji, tj. Tylko transakcję faktyczną operację wstawiania, tak aby blokada była lepiej trzymana.

Jeśli chcesz, aby cały proces był atomowy, może być pomysł, aby zapisać go w tabeli tymczasowej, a następnie zrobić wkładkę luzem (szybko), aby wstawić ją do głównego stołu.

+0

Nie jestem pewien moich granic transakcji. Mam @transactional na moich metodach DAO, które wymagają transakcji, ale mam również @transactional na moim punkcie wejścia do kodu przy użyciu DAO. Jeśli usunę pierwszy, spowoduje to błąd braku transakcji. To jest coś, co obecnie badam. Sprawdź http://stackoverflow.com/questions/807457/ –

+0

Mój @Transactional był zbyt daleko, po usunięciu go proces działa dobrze bez blokowania bazy danych. Nadal mam pewne dziwne problemy @Transactional, ale dla tego procesu rozwiązałem go po prostu polegając na mniejszych transakcjach. To pytanie również było pomocne http://stackoverflow.com/questions/1079114. –

2

Prawdopodobnie musisz zmienić swój poziom izolacji.

Oto kilka informacji: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

Mówi o różnych poziomów izolacji, a co mogą pomóc straży przeciw. Ogólny sposób, aby to zrobić, to zacząć od ścisłego, a następnie zmniejszyć, jeśli potrzebujesz lepszych czasów odpowiedzi, pamiętając o wymogach integralności danych/fałszywych odczytów. Poziomy transakcyjne

edit

sprężynowe są wykorzystywane do abstrakcyjnego JDBC (lub cokolwiek) poziomów izolacji transakcji w menedżerze transakcji. Są one zdefiniowane w klasie TransactionDefinition i są statycznymi elementami.

TransactionDefinition.ISOLATION_DEFAULT 
Default isolation 

TransactionDefinition.ISOLATION_READ_UNCOMMITTED 
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions 

TransactionDefinition.ISOLATION_READ_COMITTED 
Cannot read uncommitted data 

TransactionDefinition.ISOLATION_REPEATABLE_READ 
Ensures repeatable reads 

TransactionDefinition.ISOLATION_SERIALIZABLE 
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially. 

Dostępne są również poziomy propagacji transakcji. Możesz używać transakcji dla czystych odczytów, co może być przesadą - odczyty nie wymagają transakcji, wpisy powinny ZAWSZE zawierać transakcję wokół nich. Poziom propagacji jest również określony w definicji TransactionDefinition. Są one używane, zwykle w pliku okablowania sprężyn, do definiowania serializacji i propagacji dla określonego połączenia. Jeśli masz przykład swojego okablowania, być może będę mógł podać więcej wskazówek/informacji.

+0

Jeśli używasz menedżera transakcji Spring, podczas konfigurowania transakcji DAO możesz ustawić poziomy izolacji dla każdego połączenia transakcyjnego. – aperkins

+0

Naprawdę, możesz rozwinąć to lub skierować mnie w kierunku artykułu, który rozszerza się na to? –

+0

Należy pamiętać, że wszystkie informacje wiosenne otrzymuję z podręcznika "Pro Spring" Roba Harropa i Jana Machacka. Chociaż jest to bardzo sucha książka, to jest to dobre odniesienie do Spring z naprawdę dobrym indeksem. To była książka, która w końcu sprawiła, że ​​transakcje "kliknęły" dla mnie - chociaż zajęło to trochę czasu :) – aperkins

0

Czy próbujesz utworzyć 700 wniosków o mydło w jednej transakcji JPA? Nie rób tego. :-)

+0

Nie, program robi wywołanie SOAP, a wyniki są raportowane do bazy danych.Transakcje są obsługiwane przez Spring. –

Powiązane problemy