ORMLite的createOrUpdate似乎很慢 – 什么是正常的速度?

在我的应用程序中调用ORMLite RuntimeExceptionDaocreateOrUpdate(...)方法非常慢。

我有一个非常简单的对象( Item )与2个整数(一个是generatedId ),一个String和一个double 。 我使用下面的代码testing(粗略地)更新数据库中的对象(100次)的时间。 日志语句日志:

时间更新1行100次:3069

为什么在一个仅有1行的表格中,需要3秒才能更新对象100次。 这是正常的ORMLite速度? 如果不是,可能是什么问题?

 RuntimeExceptionDao<Item, Integer> dao = DatabaseManager.getInstance().getHelper().getReadingStateDao(); Item item = new Item(); long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { item.setViewMode(i); dao.createOrUpdate(item); } long update = System.currentTimeMillis(); Log.v(TAG, "time to update 1 row 100 times: " + (update - start)); 

如果我创build了100个新的行,那么速度就更慢了。

注意:我已经在使用ormlite_config.txt 。 它会logging"Loaded configuration for class ...Item"所以这不是问题。

谢谢。

Solutions Collecting From Web of "ORMLite的createOrUpdate似乎很慢 – 什么是正常的速度?"

这可能是不幸的“预期”速度。 确保你使用ORMLite版本4.39或更高版本。 createOrUpdate(...)正在使用一种更昂贵的方法来预先testing数据库中的对象的存在。 但我怀疑这将是一个最小的速度提高。

如果我创build了100个新的行,那么速度就更慢了。

默认情况下,Sqlite处于自动提交模式。 有一件事是尝试使用ORMLite Dao.callBatchTasks(...)方法来包装插入(或者你的createOrUpdate Dao.callBatchTasks(...)

在BulkInsertsTest androidunit testing中 ,下面的doInserts(...)方法插入1000个项目。 当我只是叫它:

 doInserts(dao); 

我的模拟器需要7.3秒。 如果我使用callBatchTasks(...)方法调用Android Sqlite中的调用来处理事务:

 dao.callBatchTasks(new Callable<Void>() { public Void call() throws Exception { doInserts(dao); return null; } }); 

这需要1.6秒。 使用dao.setSavePoint(...)方法dao.setSavePoint(...)相同的性能。 这会启动一个事务,但不如callBachTasks(...)方法,因为您必须确保closures自己的事务:

 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); } 

这也需要〜1.7秒。