情況:我需要更改數據庫中的許多記錄(例如10 000條記錄),使用ORMLite DAO。所有記錄僅在一個表中,在一列中更改,並且更改具有指定id的記錄。如何在ORM數據庫更改多條記錄快?
問題:如何一次更新數據庫中的很多記錄,使用ORMLite DAO?
現在我更新記錄,使用此代碼:循環非常慢
imagesDao.update(imageOrmRecord);
但更新記錄(100條記錄\秒)。
我認爲,真正的更新記錄,使用SQL代碼,但是這是不可取的......
情況:我需要更改數據庫中的許多記錄(例如10 000條記錄),使用ORMLite DAO。所有記錄僅在一個表中,在一列中更改,並且更改具有指定id的記錄。如何在ORM數據庫更改多條記錄快?
問題:如何一次更新數據庫中的很多記錄,使用ORMLite DAO?
現在我更新記錄,使用此代碼:循環非常慢
imagesDao.update(imageOrmRecord);
但更新記錄(100條記錄\秒)。
我認爲,真正的更新記錄,使用SQL代碼,但是這是不可取的......
SQL是一種面向集合的語言。 ORM的要點是將其抽象爲對象。 所以,當你想更新了一堆的對象,你必須去通過這些對象。 (您已運行到object-relational impedance mismatch;也讀The Vietnam of Computer Science)
ORMLite爲您提供了一個後門to execute raw SQL:
someDao.executeRaw("UPDATE ...");
但是,如果你唯一的問題是性能,這很可能是由自動所致提交模式,它將事務開銷添加到每個單獨的語句。使用callBatchTasks()可以解決這個問題。
問題:在數據庫中更新如何對多條記錄一次,使用DAO ORMLite?
這取決於什麼更新你是一個位。你當然可以使用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。
什麼是你的問題? – GhostCat