Как предотвратить вставки JPA от блокировки таблицы базы данных? - PullRequest
5 голосов
/ 30 июля 2009

Я использую JPA с поддержкой Hibernate в качестве слоя персистентности. У меня есть многопоточный процесс, который собирает данные из вызова Soap, а затем сохраняет строку в базе данных. Процесс обычно заканчивается вставкой около 700 строк и занимает от 1 до 3 часов, при этом вызовы Soap являются основным узким местом.

В течение всего этого процесса таблица, которую я вставляю в блокировки, не будет своевременно возвращать операторы выбора.

Вот ошибка SQL-сервера:

Сообщение об ошибке: превышен период ожидания запроса блокировки.

Как избежать блокировки таблицы базы данных во время этого длительного процесса?

Ответы [ 3 ]

2 голосов
/ 30 июля 2009

Возможно, вам нужно изменить уровень изоляции.

Вот некоторая информация: http://www.interview -questions-tips-forum.net / index.php / Your-Вопросы-на-Java / JDBC-транзакции / Transaction-изолирующие-Levels

В нем говорится о различных уровнях изоляции и о том, что они могут помочь защитить. Общий способ сделать это - начать со строгого, а затем понизить, если вам нужно лучшее время отклика, учитывая при этом требования целостности данных / ложного чтения.

редактировать

Spring Transaction уровни используются для абстрагирования уровней изоляции транзакций JDBC (или любого другого) в менеджере транзакций. Они определены в классе TransactionDefinition и являются статическими членами.

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.

Существуют также уровни распространения транзакций. Вы можете использовать транзакцию для чистых операций чтения, что может быть чрезмерным - операции чтения не требуют транзакций, записи должны выполняться ВСЕГДА при наличии транзакции вокруг них. Уровни распространения также определены в TransactionDefinition. Они используются, как правило, в файле пружинной разводки, чтобы определить сериализацию и распространение для конкретного вызова. Если у вас есть пример вашего подключения, я мог бы дать еще несколько советов / информации.

1 голос
/ 31 июля 2009

Вставляете ли вы все 700 строк с одинаковой транзакцией ?

Где находится граница вашей транзакции? Если бы вы могли уменьшить границы транзакции, то есть только транзакцию с фактической операцией вставки, чтобы блокировка удерживалась недолго.

Если вам нужно, чтобы весь процесс был атомарным, возможно, было бы целесообразно записать его во временную таблицу, а затем выполнить массовую (быструю) вставку, чтобы вставить ее в основную таблицу.

0 голосов
/ 30 июля 2009

Вы пытаетесь сделать 700 запросов на мыло в одной транзакции JPA? Не делай этого. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...