织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 基础技术 > 数据库开发 >

测试在多线程下操作sqlite内存数据库

jackyhwei 发布于 2011-12-02 15:14 点击:次 
sqlite数据库本质上就是一个文件,数据库的操作也就是文件的访问是通过文件锁的方式进行互斥的。在同一时刻允许多个并发的数据库读,但是数据库写操作是独占式的。同一时刻只能有一个写操作。
TAG:

硬件平台: Linux on vmware6
操作系统:Trustix Linux3
SQLITE: sqlite-3.5.7


以下摘自:http://www.sqlite.org/c3ref/open.html

If the filename is ":memory:", then an private in-memory database is created for the connection. This in-memory database will vanish when the database connection is closed. Future version of SQLite might make use of additional special filenames that begin with the ":" character. It is recommended that when a database filename really does begin with ":" that you prefix the filename with a pathname like "./" to avoid ambiguity.

  1. int sqlite3_open( 
  2.   const char *filename,   /* Database filename (UTF-8) */ 
  3.   sqlite3 **ppDb          /* OUT: SQLite db handle */ 
  4. ); 

我在主线程中使用
int sqlitehandle = sqlite3_open(":memory:", &pdb);
创建内存数据库,并创建表:
int rs = sqlite3_exec(pdb, "CREATE TABLE testtbl(id int NOT NULL, name varchar(100))", 0, 0,0);


然后创建两个新的线程,将pdb传入线程中,主线程进入睡眠。
在两个线程中,均执行:
while(1)
{
    int rs = sqlite3_exec(pdb, "INSERT INTO testtbl values(25,'aaaaaaaaaaaa')", 0,0,0);
    printf("rs = %d\n", rs);
    if(rs != SQLITE_OK)
    {
        printf("err rs=%d\n", rs);
        break;
    }
    usleep(10);
}

测试结果显示是可以两个线程操作同一个句柄的!!!
并且在程序运行时,我用lsof命令查看该进程的句柄状态,确实没有任何磁盘的操作!!!

但有个问题不知道是否是由于我是虚拟机引起,即该程序在执行(约1分钟后),两个线程像是进入死锁状态,再没有任何动作,没有退出,也没有显示insert失败!这暂时不理解。

文件: sqlite-3.5.7.tar.gz
大小: 2506KB
下载: 下载




2008.5.5增加:

根据sqlite3的描述,自3.3.1版本起才能在多个线程中操作同一个句柄.但未测试;

另外,上面的例子中,如果不是内存数据库,那么多个线程同时写同一个句柄,sqlite_exec会返回21的错误,这说明了需要在写前加锁.

SQLite不仅可以把数据库 放在硬盘上,还可以放在内存中(sqlite3_open(":memory:", &db)),经测试,同样条件下数据库放在内存中比放在硬盘上插入记录速度快差不多3倍。但数据库放在内存中时有如下缺陷:

1、断电或程序崩溃后数据库就会消失,你需要定期Attach到硬盘上备份;

2、在内存中的数据库不能被别的进程访问(因为没名字,以后可能支持),即使在多线程下,也得使用同一句柄;

3、不支持像在硬盘上的读写互斥处理,自己加锁吧。

看来,追求速度要付出代价啊!

 

sqlite数据库本质上就是一个文件,数据库的操作也就是文件的访问是通过文件锁的方式进行互斥的。在同一时刻允许多个并发的数据库读,但是数据库写操作是独占式的。同一时刻只能有一个写操作。

(iltaek)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201112/15396.html]
本文出处:blog.csdn.net/iltaek 作者:iltaek 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容