提高ormlite的批处理速度
This may be the "expected" speed unfortunately. Make sure you are using ORMLite version 4.39 or higher. createOrUpdate(...)
was using a more expensive method to test for existing of the object in the database beforehand. But I suspect this is going to be a minimal speed improvement.
If I create 100 new rows then the speed is even slower.
By default Sqlite is in auto-commit mode. One thing to try is to wrap your inserts (or your createOrUpdate
s) using the the Dao.callBatchTasks(...)
method.
In by , the following doInserts(...)
method inserts 1000 items. When I just call it:
doInserts(dao);
It takes 7.3 seconds in my emulator. If I call using the callBatchTasks(...)
method which wraps a transactions around the call in Android Sqlite:
dao.callBatchTasks(new Callable() { public Void call() throws Exception { doInserts(dao); return null; } });
It takes 1.6 seconds. The same performance can be had by using the dao.setSavePoint(...)
method. This starts a transaction but is not as good as the callBachTasks(...)
method because you have to make sure you close your own transaction:
DatabaseConnection conn = dao.startThreadConnection(); Savepoint savePoint = null; try { savePoint = conn.setSavePoint(null); doInserts(dao); } finally { // commit at the end conn.commit(savePoint); dao.endThreadConnection(conn); }
This also takes ~1.7 seconds.
dao.setsavePoint开始一个事务,但不如callBachTasks(...)
方法,因为你必须确保你闭上你自己的事务: