2016-12-18 5 views
1

Ситуация: Мне нужно изменить многие записи в базе данных (10 000 записей, например), используя ORMLite DAO. Все записи изменяются только в одной таблице, в одном столбце и изменении записей, которые имеют указанный идентификатор.Как быстро изменить многие записи в базе данных ORM?

Вопрос: как обновление много записей в базе данных сразу, используя ORMLite DAO?


Теперь обновлять записи, используя этот код:

imagesDao.update(imageOrmRecord);

Но обновляемые записи в цикле очень медленно (100 записей \ сек).

Я думаю, что реальное обновление записей, используя SQL-кода, но это нежелательно ...

+0

И какой именно вопрос? – GhostCat

ответ

1

SQL является ориентированной на набор языков. Вся цель ORM - отвлечь это на объекты. Итак, когда вы хотите обновить кучу объектов, вам нужно пройти через эти объекты. (Вы израсходовали в object-relational impedance mismatch, также читали The Vietnam of Computer Science.)

ORMLite дает бэкдор to execute raw SQL:

someDao.executeRaw("UPDATE ..."); 

Но если ваша единственная проблема заключается в производительности, это, вероятно, вызвано авто- commit, который добавляет накладные расходы транзакции для каждого отдельного оператора. С помощью callBatchTasks() это исправит.

0

Вопрос: как обновить многие записи в базе данных сразу, используя ORMLite DAO?

Это зависит от того, какие обновления вы делаете. Вы можете, конечно, использовать UpdateBuilder, который будет производить оптовые обновления объектов.

UpdateBuilder<Account, String> updateBuilder = accountDao.updateBuilder(); 
// update the password to be "none" 
updateBuilder.updateColumnValue("password", "none"); 
// only update the rows where password is null 
updateBuilder.where().isNull(Account.PASSWORD_FIELD_NAME); 
updateBuilder.update(); 

Или что-то вроде:

// update hasDog boolean to true if dogC > 0 
updateBuilder.updateColumnExpression("hasDog", "dogC > 0"); 

Вы должны быть в состоянии выполнить большой процент обновлений, которые вы могли бы сделать с использованием сырья SQL таким образом.

Но если вам нужно сделать обновления для каждого объекта, вам нужно будет сделать dao.update(...) для каждого. Тогда я должен сделать это в транзакции, чтобы сделать обновления быстрее. См. this answer.