Ormlite取消自动Commit,提升保存数据速度
2015-10-22 11:16
465 查看
最近在使用Ormlite遇到个小问题,当我需要保存数组的时候,速度挺慢的,耗费了19.892,接近20秒去保存个300的数组,真的是慢到不行啊,因为代码是这么写的
save函数是这样的
这样的效率在保存几个的时候可以,但是,如果这个数组大了,简直致命啊。
那么该如何改进呢?
最简单的想法是这样的
但这个的改善还是有限的,只是提高了一倍,耗时11.889 秒来保存,还是达不到我们的需要。
那么问题到底出在哪里呢,时间都去哪儿了,就是保存个300的数组而已。看下下面这个版本就明白很多了。
通过上面的写法,保存一个300大小的数组,时间从原来的20秒缩短到了0.189秒,接近100倍的性能差异啊。而对比发现不一样的地方在我们设置
可以满足我们的性能需求。就算扩大到1000,耗时也就0.518。还是挺好的,满足现阶段的需求。
在这基础,查看文档后,发现还有一个在提升个10%左右性能的方法
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(); } }
相关文章推荐
- 选定虚拟主机 性能凸显优势
- 修改一行代码提升 Postgres 性能 100 倍
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- 推荐Sql server一些常见性能问题的解决方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
- 和表值函数连接引发的性能问题分析
- SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之一
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- 数据库性能优化三:程序操作优化提升性能
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法