您的位置:首页 > 其它

Ormlite取消自动Commit,提升保存数据速度

2015-10-22 11:16 465 查看
最近在使用Ormlite遇到个小问题,当我需要保存数组的时候,速度挺慢的,耗费了19.892,接近20秒去保存个300的数组,真的是慢到不行啊,因为代码是这么写的

for (User user : userList) {
user.save(this);
}


save函数是这样的

public void save(Context mContext) {
DataHelper dataHelper = new DataHelper(mContext);
try {
dataHelper.getUserDao().create(this);
} catch (SQLException e) {
e.printStackTrace();
} finally {
dataHelper.close();
}
}


这样的效率在保存几个的时候可以,但是,如果这个数组大了,简直致命啊。

那么该如何改进呢?

最简单的想法是这样的

public static  void saveList2(List<User> list, Context mContext) {
try {
DataHelper dataHelper = new DataHelper(mContext);
Dao<User, Integer> dao = dataHelper.getUserDao();
for (User user : list) {
dao.create(latLngInfo);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
dataHelper.close();
}
}


但这个的改善还是有限的,只是提高了一倍,耗时11.889 秒来保存,还是达不到我们的需要。

那么问题到底出在哪里呢,时间都去哪儿了,就是保存个300的数组而已。看下下面这个版本就明白很多了。

public static  void saveList(List<User> list, Context mContext) {
DataHelper dataHelper = new DataHelper(mContext);
try {
Dao<User, Integer> dao = dataHelper.getUserDao();
AndroidDatabaseConnection db = new AndroidDatabaseConnection(
dataHelper.getWritableDatabase(), true);
db.setAutoCommit(false);
for (User cd : list) {
dao.create(cd);
}
db.commit(null);
} catch (SQLException e) {
e.printStackTrace();
} finally {
dataHelper.close();
}
}


通过上面的写法,保存一个300大小的数组,时间从原来的20秒缩短到了0.189秒,接近100倍的性能差异啊。而对比发现不一样的地方在我们设置
setAutocommit
false
,从而批量的commit来提高性能的。

可以满足我们的性能需求。就算扩大到1000,耗时也就0.518。还是挺好的,满足现阶段的需求。

在这基础,查看文档后,发现还有一个在提升个10%左右性能的方法

public static void saveList3(List<User> list, Context mContext) {
DataHelper dataHelper = new DataHelper(mContext);
try {
Dao<User, Integer> dao = dataHelper.getUserDao();
DatabaseConnection conn = dao.startThreadConnection();
Savepoint savePoint = conn.setSavePoint(null);
for (User user : list) {
dao.create(user);
}
conn.commit(savePoint);
dao.endThreadConnection(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
dataHelper.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息