Sqlite 三篇“评测”,“内存数据库”,“no transaction is active”

前端之家收集整理的这篇文章主要介绍了Sqlite 三篇“评测”,“内存数据库”,“no transaction is active”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

(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
* 机器配置: Core2 E4500cpu 2G 内存

上表为两种数据库只建一个索引, Berkeley DB 不支持事务、 sqlite 支持事务情况下的数据,如果 Berkeley DB 打开事务支持,速度会下降很大的数量级,根本不能满足需求。另外在程序崩溃后 Berkeley DB 数据库不可用, sqlite 数据库仍可正常使用。

猜你在找的Sqlite相关文章