(from: http://blog.csdn.net/mynicedream)
sqlite内存数据库使用有感
sqlite不仅可以把数据库放在硬盘上,还可以放在内存中(sqlite3_open(":memory:",&db)),经测试,同样条件下数据库放在内存中比放在硬盘上插入记录速度快差不多3倍。但数据库放在内存中时有如下缺陷:
1、断电或程序崩溃后数据库就会消失,你需要定期Attach到硬盘上备份;
2、在内存中的数据库不能被别的进程访问(因为没名字,以后可能支持),即使在多线程下,也得使用同一句柄;
3、不支持像在硬盘上的读写互斥处理,自己加锁吧。
看来,追求速度要付出代价啊!
sqlite的 cannot commit - no transaction is active报错
最近测试sqlite时遇到了一个奇怪的问题,我在大批量循环插入记录时偶然会报告“cannot commit - no transaction is active”错误,多次尝试仍然如此,代码如下:
...
for (int j=0;j<100000;j++)
{
rc = sqlite3_exec(db,"BEGIN TRANSACTION;",NULL,&errMsg);
for (int i=0;i<1000;i++)
{
strsql.Format("INSERT INTO students VALUES(%d,%d,'%30d');",j,i,j*10000+i);
rc = sqlite3_exec(db,strsql,&errMsg);
}
strsql = "COMMIT TRANSACTION;";
rc = sqlite3_exec(db,&errMsg);
}
...
后来,我发现每当报告“cannot commit - no transaction is active”错误前,还会报告一个“database or disk is full”错误,该错误是"INSERT INTO students VALUES(%d,时报告的,但事实上,我的硬盘空间很足,sqlite不是独占数据库访问吗?疑惑之下我到网上搜索了一番,发现可能是 Window文件系统问题或杀毒软件影响^.^,看来暂时没办法解决了,只能自己写好出错处理或期待sqlite出新版解决该BUG了。
免费的实时数据库,我们该选谁?----BerkeleyDB与sqlite评测对比
最近要做一个项目,需要用到实时数据库,PI太贵了,想找一个免费的,实在不行就只能自己编了。找了半天,找到了FastDB、BerkeleyDB和sqlite.
FastDB是内存型数据库,据说很快,但数据库大小不能大于物理内存,不然。。。反正我看到这就走了,我可是要一秒内处理几千个数据,还要保存8小时以 上的啊!BerkeleyDB和sqlite倒没有数据库大小不能大于物理内存的限制,我对他们的性能进行了测试,结果如下:
|
Berkeley DB
|
sqlite
|
插入 10000 条记录耗时
|
0.08 秒
|
0.42 秒
|
插入 100000 条记录耗时
|
2.31 秒
|
3.81 秒
|
插入 7200000 条记录耗时
|
1024.34 秒
|
249 秒
|
插入 57600000 条记录耗时
|
12860.78 秒
|
2155.14 秒
|
插入 172800000 条记录耗时
|
48039.64 秒
|
6352.06 秒
|
10000 条记录查 1 记录耗时
|
少于 0.01 秒
|
少于 0.01 秒
|
100000 条记录查 1 记录耗时
|
少于 0.01 秒
|
少于 0.01 秒
|
7200000 条记录查 1 记录耗时
|
少于 0.01 秒
|
少于 0.01 秒
|
57600000 条记录查 1 记录耗时
|
0.03 秒
|
0.16 秒
|
172800000 条记录查 1 记录耗时
|
0.03 秒
|
0.09 秒
|
10000 条记录数据库大小
|
0.628M
|
0.527M
|
100000 条记录数据库大小
|
5.29M
|
5.32M
|
7200000 条记录数据库大小
|
516M
|
405M
|
57600000 条记录数据库大小
|
3087.13M
|
3925.8M
|
172800000 条记录数据库大小
|
11890.7M
|
10621.2M
|
上表为两种数据库只建一个索引, Berkeley DB 不支持事务、 sqlite 支持事务情况下的数据,如果 Berkeley DB 打开事务支持,速度会下降很大的数量级,根本不能满足需求。另外在程序崩溃后 Berkeley DB 数据库不可用, sqlite 数据库仍可正常使用。