Android数据库大批量数据插入优化

对比在android中批量插入数据的3中方式对比(各插入1W条数据所花费的时间):

1、 一个一个插入


 1 public static boolean insert(SQLiteOpenHelper openHelper,
 2             RemoteAppInfo appInfo) {
 3         if (null == appInfo) {
 4             returntrue;
 5         }
 6         SQLiteDatabase db = null;
 7         try {
 8             db = openHelper.getWritableDatabase();
 9             ContentValues values = appInfo.getContentValues();
10             return -1 != db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null,
11                     values);
12         } catch (Exception e) {
13             e.printStackTrace();
14         } finally {
15             if (null != db) {
16                 db.close();
17             }
18         }
19         returnfalse;
20     }
21
22
23     for (RemoteAppInfo remoteAppInfo : list) {
24           RemoteDBUtil.insert(helper, remoteAppInfo);
25         }

耗时:106524ms,也就是106s

2、 开启事务批量插入,使用SqliteDateBase中的insert(String table, String nullColumnHack, ContentValues values)方法


 1 public static boolean insert(SQLiteOpenHelper openHelper,
 2         List list) {
 3     boolean result = true;
 4     if (null == list || list.size() <= 0) {
 5         returntrue;
 6     }
 7     SQLiteDatabase db = null;
 8
 9     try {
10         db = openHelper.getWritableDatabase();
11         db.beginTransaction();
12         for (RemoteAppInfo remoteAppInfo : list) {
13             ContentValues values = remoteAppInfo.getContentValues();
14             if (db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null, values) < 0) {
15                 result = false;
16                 break;
17             }
18         }
19         if (result) {
20             db.setTransactionSuccessful();
21         }
22     } catch (Exception e) {
23         e.printStackTrace();
24         returnfalse;
25     } finally {
26         try {
27             if (null != db) {
28                 db.endTransaction();
29                 db.close();
30             }
31         } catch (Exception e) {
32             e.printStackTrace();
33         }
34     }
35     returntrue;
36 }  

耗时:2968ms

3、 开启事务批量插入,使用SQLiteStatement

 1 public static boolean insertBySql(SQLiteOpenHelper openHelper,
 2             List list) {
 3         if (null == openHelper || null == list || list.size() <= 0) {
 4             returnfalse;
 5         }
 6         SQLiteDatabase db = null;
 7         try {
 8             db = openHelper.getWritableDatabase();
 9             String sql = “insert into “ + RemoteDBHelper.TABLE_APP_REMOTE + “(“
10                     + RemoteDBHelper.COL_PKG_NAME + “,”// 包名
11                     + RemoteDBHelper.COL_USER_ACCOUNT + “,”// 账号
12                     + RemoteDBHelper.COL_APP_SOURCE + “,”// 来源
13                     + RemoteDBHelper.COL_SOURCE_UNIQUE + “,”// PC mac 地址
14                     + RemoteDBHelper.COL_MOBILE_UNIQUE + “,”// 手机唯一标识
15                     + RemoteDBHelper.COL_IMEI + “,”// 手机IMEI
16                     + RemoteDBHelper.COL_INSTALL_STATUS + “,”// 安装状态
17                     + RemoteDBHelper.COL_TRANSFER_RESULT + “,”// 传输状态
18                     + RemoteDBHelper.COL_REMOTE_RECORD_ID // 唯一标识
19                     + “) “ + “values(?,?,?,?,?,?,?,?,?)”;
20             SQLiteStatement stat = db.compileStatement(sql);
21             db.beginTransaction();
22             for (RemoteAppInfo remoteAppInfo : list) {
23                 stat.bindString(1, remoteAppInfo.getPkgName());
24                 stat.bindString(2, remoteAppInfo.getAccount());
25                 stat.bindLong(3, remoteAppInfo.getFrom());
26                 stat.bindString(4, remoteAppInfo.getFromDeviceMd5());
27                 stat.bindString(5, remoteAppInfo.getMoblieMd5());
28                 stat.bindString(6, remoteAppInfo.getImei());
29                 stat.bindLong(7, remoteAppInfo.getInstallStatus());
30                 stat.bindLong(8, remoteAppInfo.getTransferResult());
31                 stat.bindString(9, remoteAppInfo.getRecordId());
32                 long result = stat.executeInsert();
33                 if (result < 0) {
34                     returnfalse;
35                 }
36             }
37             db.setTransactionSuccessful();
38         } catch (Exception e) {
39             e.printStackTrace();
40             returnfalse;
41        } finally {
42             try {
43                 if (null != db) {
44                     db.endTransaction();
45                     db.close();
46                 }
47             } catch (Exception e) {
48                 e.printStackTrace();
49             }
50         }
51         returntrue;
52     }

耗时:1365ms

时间: 2024-09-30 17:11:46

Android数据库大批量数据插入优化的相关文章

数据分析 大数据-数据库大数据的优化方法

问题描述 数据库大数据的优化方法 数据库的数据库达到数百亿上千亿的时候,查询数据库中数据会发生长时间卡顿,怎么才能优化?使大数据查询流畅??? 解决方案 那么大数量级的没做过,不过根据查询条件设置分区表是个不错的选择 解决方案二: 大数据量高并发访问的数据库优化方法大数据量高并发访问的数据库优化方法大数据量高并发的数据库优化 解决方案三: 如果没有分布式的条件,那可以考虑分库,但是分库也带来了查询的复杂性,综合考虑吧,另外就是查询时,按一定条件查询,不要全部查询,建好索引 解决方案四: 数据库

shard-mongodb 分片集群,大批量数据插入效率问题

问题描述 mongodb 分片集群,大批量数据插入效率问题 mongodb 分片集群,大批量数据插入效率问题: 1个config.1个mongos.2个mongod shard,现有2台同配置的机器 (1)当2个shard在同一台机器时候,无论哪一台,插入效率在1w每秒左右: 当数据量达到1.5亿左右的时候,会出现flushing nmaps took xxxx秒 to xxx files 的日志信息,过几十秒就来一次,很卡. (2)当shard分布在2台机器时候,插入效率只有1500-2000

mysql 数据插入优化方法_Mysql

通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的: 当concurrent_insert=0时,不允许并发插入功能. 当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省). 当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入. 这样看来,把concurrent_ins

java中用的数据库是access插入数据

问题描述 java中用的数据库是access插入数据 为什么我的文本类型插不进去? 解决方案 这里,小二是一个变量,如果仅仅是字面值,去掉前面的 ""+ 和后面的 +"",别的类似. 解决方案二: 编辑器都提示了语法错误,根本就不能编译通过,怎么插 解决方案三: java读取access数据库数据Java 从Access数据库读取数据插入到JavaDB数据库表中java 无需建立数据源连接access数据库

大数据量下的数据库查询与插入如何优化? (整理)

数据库经常要做一些查询与插入,但是如果查询和插入的数据量过大的时候就会引发数据库性能问题,降低数据库工作效率.因此性能调优是大家在工作中都能够预见的问题,大到世界五百强的核心系统,小到超市的库存系统,几乎都会有要调优的时候.面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩. 1.尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询 2.避免频繁创建和删除临时表,以减少系统表资源的消耗. 3.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理. 4.建立高效的索引

android开发-android数据库插入问题老是出错。新手。很急,在线等。谢谢大神了

问题描述 android数据库插入问题老是出错.新手.很急,在线等.谢谢大神了 public class MyDatabaseHelper extends SQLiteOpenHelper { final String CREATE_TABLE_SQL = "create table dict(_id integer primary " + "key autoincrement , word , detail)"; public MyDatabaseHelper(C

asp.net-databel中的数据插入到数据库

问题描述 databel中的数据插入到数据库 excel中的数据是每天累加的,但是每次都要全部导入数据库,所以数据库中的数据会有大量的重复,浪费资源,求一个办法,可以去除重复,并且速度要快一点;目前我采用的方法是,每词都去数据库中判断,如果存在的话就更新,不存在的话就插入,速度非常慢,不到1w条数据,都要用奖金两分钟,求各位大神们给一个更好的办法 解决方案 你每次都要去访问这样会浪费大量的资源,你可以先将excel中的关键列获取出来,放到内存中,在内存中进行判断,这样会提高点效率. 解决方案二:

h2 删数据 sql优化-h2数据库删除数据速度问题

问题描述 h2数据库删除数据速度问题 想删除h2数据库中某个表部分数据,但该表中有八千万左右数据,如何删除符合要求的一小部分数据呢?比如删除name以abc开头的数据,因为h2数据库我是通过web打开查看的,普通的Sql语句要执行很长很长时间,而且经常报内存不足,各位大神有没有什么优化的方法???求指点呀 解决方案 http://www.lc365.net/blog/b/32424/ 解决方案二: 因为没分了,不过谢谢能回答,对我其他的一些地方有帮助

把数据插入到数据库的两种方法

插入|数据|数据库 把表单中的数据插入到数据库中有两种方法.1.直接使用sql语句的 优点:速度快,不耗资源 缺点:不能传递太长的字段内容,字段比较多时不易排错. 推荐有经验的编程者优先考虑. 具体操作: 假设表单中有以下字段:username,password,sex,age 对应的,在程序中有username,password,sex,age已取通过request.form或request.querystring取到字段的值. 数据库表user中有username,password,sex,