Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116456
  • 博文数量: 11
  • 博客积分: 565
  • 博客等级: 中士
  • 技术积分: 267
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-02 17:17
文章分类
文章存档

2014年(1)

2012年(2)

2011年(4)

2010年(4)

我的朋友

分类: 数据库开发技术

2010-07-04 11:05:26

在对sqlite3 insert into等操作时速度比较慢。

原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。

解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。

接口:事务的操作没有特别的接口函数,就是一个普通的sql语句而已,分别如下:


int ret;
ret = sqlite3_exec( db, "begin transaction", 0, 0, &zErrorMsg ); //开始一个事务

ret = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg ); //提交事务

ret = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg );


例程:在进行大量的操作前使用如下语句


ret = sqlite3_exec(db,"begin transaction",0,0,&zErrorMsg);
for(...)
{
 //insert into operate

 
 //如果操作错误

 ret = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg )
}
ret = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg );


开发过程遇到这样的问题:

分别对两个数据库文件的不同表进行操作,执行顺序为:open db A->begin trasaction->open db B->select from db B->close db B->select from db A->rollbak or commit->close db A

测试发现,select from db B这一步会出错,错误信息为library routine called out of sequence,出错后执行rollback,这一步也会报错。

原来以为原因是:开始一个事务只能对一个数据库进行操作。

测试发现,即使不开始事务,执行顺序为:open db A->open db B->select from db B->close db B->select from db A->close db A,仍会出现ibrary routine called out of sequence的错误。

难道打开一个数据库,在关闭其之前不能打开其他数据库?

难道sqlite的并发执行需要用户自己来控制?


今天发现,以上出错原因可能是总控程序和子程序的全局变量一致(都是sqlite3 *db),导致总控程序的全局变量被修改。

具体还需进一步研究。



阅读(5347) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux时钟中断

给主人留下些什么吧!~~