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

最近在使用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倍的性能差异啊。而对比发现不一样的地方在我们设置setAutocommitfalse,从而批量的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();
        }
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值