在Titanium中通过使用BEGIN/COMMIT来加速SQLite插入操作

对于Titanium的性能一直是大家关心的一个问题,今天给大家分享一个提高往数据库中插入数据性能的方法:使用BEGIN/COMMIT。

一般我们在往数据库中插入数据的时候,通常的做法是:
1、打开DB var db = Ti.Database.open();
2、执行插入语句 db.execute();
3、关闭数据库 db.close();

为大家介绍的技巧是:
在执行插入语句之前先执行db.execute('BEGIN;');
在执行插入语句之后执行db.execute('COMMIT;');

这样一来就能大幅提高数据库的插入性能。

我们拿Android版的应用来测试一下到底是否能提高性能,这里我们试着往数据库中插入1000件数据,看看一般的做法和使用了该技巧之后的执行速度有什么差距。


Ti.include("tracer.js");

// BEFORE
var dbLog = tracer.createTracer('db');
dbLog.info('opening database');
var db = Ti.Database.open("TEST");
//db.execute("CREATE TABLE ITEM(ID integer, VALUE varchar(20))");

dbLog.info('deleting old items');
db.execute('DELETE FROM ITEM');
dbLog.info(db.rowsAffected + ' rows deleted');

dbLog.info('starting insert');
for( var i = 0; i < 1000; i++ ){
db.execute('INSERT INTO ITEM (ID, VALUE) VALUES(?,?)', i, 'VALUE'+i);
}
dbLog.info( 'finished inserts' );
dbLog.info( 'closing database' );
db.close();
dbLog.info('database save complete');

// AFTER
var dbLog2 = tracer.createTracer('db2');
dbLog2.info('opening database');
var db2 = Ti.Database.open("TEST");
dbLog2.info('deleting old items');
db2.execute('DELETE FROM ITEM');
dbLog2.info(db2.rowsAffected + ' rows deleted');
dbLog2.info('starting BEGIN');
db2.execute('BEGIN;');
dbLog2.info('starting insert');
for( var i = 0; i < 1000; i++ ){
db2.execute('INSERT INTO ITEM (ID, VALUE) VALUES(?,?)', i, 'VALUE'+i);
}
dbLog2.info( 'finished inserts' );
dbLog2.info( 'starting commit' );
db2.execute('COMMIT;');
dbLog2.info( 'finished commit' );
dbLog2.info( 'closing database' );
db2.close();
dbLog2.info('database save complete');


执行结果如下:
[img]http://dl.iteye.com/upload/attachment/0065/4922/5848dd6d-2443-3b25-aac3-028c866d8677.gif[/img]

[color=blue][size=medium][b]可以明显的看出所花费的时间从 7670ms 变为了 1609ms,大概提高了7倍的速度。[/b][/size][/color]

很多人马上会问到为什么加了之后性能就提高了呢?其实大家查看[url=https://github.com/appcelerator/titanium_mobile/blob/master/android/modules/database/src/java/ti/modules/titanium/database/TiDatabaseProxy.java]TiDatabaseProxy.java[/url]的源码你会发现,Titanium也只是将SQL的执行交给了Android来执行。所以归根结底还是Android系统的android.database.sqlite.SQLiteDatabase这个类的作用。

其中的tracer是一个输入LOG的库,示例代码也上传给大家[url=http://dl.iteye.com/topics/download/a442eecb-b8b0-3cd1-add0-a94d96286dc6]code.rar[/url]!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值