Как мне предотвратить блокировку JPA inserts таблицы базы данных?

StackOverflow https://stackoverflow.com/questions/1208936

Вопрос

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

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

Вот ошибка SQL server:

Сообщение об ошибке:Превышен тайм-аут запроса на блокировку.

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

Это было полезно?

Решение

Вставляете ли вы все 700 строк с помощью одной и той же транзакции?

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

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

Другие советы

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

Вот некоторая информация:http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

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

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

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

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.Они используются, обычно в файле spring wiring, для определения сериализации и распространения для конкретного вызова.Если у вас есть пример вашего подключения, я мог бы дать еще несколько советов / информации.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top