#java #postgresql #sqlite #ormlite #java-stored-procedures
#java #postgresql #sqlite #ormlite #java-хранимые процедуры
Вопрос:
Я использую ORMLite в решении, созданном сервером и клиентами.
На стороне сервера я использую PostgreSQL, на стороне клиента я использую SQLite. В коде я использую те же методы ORMLite, не заботясь об управляемой базе данных (PostgreSQL или SQLite).
Допустим, что:
- Таблица A соответствует классу A
- У меня есть Arraylist объектов A
- Я хочу вставить все элементы ArrayList в БД.
Сегодня я использую цикл for() и вставляю их один за другим (делая это в диспетчере транзакций). Когда элементов мало, проблем нет, но теперь элементов становится все больше, и это, вероятно, не лучший способ, в том числе потому, что я надолго блокирую БД.
Я ищу способ вставить все элементы за один шаг, чтобы идти быстро, чтобы не блокировать базу данных на долгое время. Я понял, что это должно быть что-то вроде хранимых процедур (я не эксперт …).
Следует отметить, что некоторые элементы могут быть новыми (то есть уже не существует элемента с тем же идентификатором первичного ключа), затем необходимо выполнить и ВСТАВИТЬ; другие элементы могут существовать, поэтому следует выполнить ОБНОВЛЕНИЕ.
Спасибо
Ответ №1:
Я ищу способ вставить все элементы за один шаг, чтобы идти быстро, чтобы не блокировать базу данных на долгое время.
Итак, есть два способа сделать это, о которых я знаю: транзакции и отключение автоматической фиксации. Если вы вставляете в базу данных, и все это должно происходить «сразу» с точки зрения согласованности, транзакции — это единственный путь. Если вы просто хотите вставить и обновить большое количество записей с более высокой производительностью, вы можете отключить автоматическую фиксацию, выполнить операции, а затем зафиксировать. В зависимости от реализации базы данных, это то, что на самом TransactionManager
деле делает.
Я понял, что это должно быть что-то вроде хранимых процедур…
Я не понимаю, как хранимые процедуры вам вообще помогают. Они не волшебные.
но теперь элементов становится все больше, и это, вероятно, не лучший способ, в том числе потому, что я надолго блокирую БД.
Я не думаю, что для этого есть волшебное решение. Если вы загружаете большое количество объектов в базу данных и вам нужны транзакционные данные, то во время обновлений будут удерживаться блокировки. Следует понимать, что postgres должен справляться с этим намного лучше, чем Sqlite. Sqlite не имеет (я не думаю) блокировки на уровне строк, что означает, что вся база данных приостанавливается во время транзакций. Postgres имеет гораздо более зрелую систему блокировки и должна быть более производительной в этой ситуации. Именно поэтому Sqlite так быстр во многих других операциях, потому что он не должен быть обременен сложностью блокировки.
Одна вещь, которую следует учитывать, — это перестроить вашу схему. Попробуйте определить минимальный объем данных, который необходимо вставить транзакционно. Например, возможно, необходимо изменить только отношения объектов транзакционно, но все данные могут быть сохранены позже. Например, у вас может быть AccountOwner
объект, который имеет только 2 идентификатора, в то время как вся информация о Account
нем может храниться вне транзакции. Это делает вашу схему более сложной, но, возможно, намного быстрее.
Надеюсь, что здесь что-то поможет.
Комментарии:
1. Большое вам спасибо, Грей, я изучу ваше решение и применю его.
Ответ №2:
вы можете использовать entityManager.merge([list of items]);
EntityManager, который вставит список одним выстрелом.
Слияние создает объект, если он не существует в базе данных, и обновляется, если он уже существует.
Комментарии:
1. Привет, спасибо за ваш ответ, я просматриваю Google, но я не понял, доступна ли эта функция для ORMLite Java. В случае, какую библиотеку (file .jar) вы предлагаете?