SQLITE 全面解析 附封装源码

  • 格式:pdf
  • 大小:238.77 KB
  • 文档页数:17

SQLite 只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也 就是说,即事务 T1 在 A 表插入一条数据,事务 T2 在 B 表中插入一条数据,这两个操作不 能同时进行,即使你的机器有 100 个 CPU,也无法同时进行,而只能顺序进行。表级都不 能并行,更别说元组级了——这就是库级锁。但是,SQLite 尽量延迟申请 X 锁,直到数据 块真正写盘时才申请 X 锁,这是非常巧妙而有效的。 恢复 SQLite 的恢复技术是影子分页技术(shadow paging)技术的典型代表。 DBMS 的常用恢复技术有影子分页技术与基于日志的技术,前者在早其数据库管理系 统中用到,比如 System R,现代 DBMS 中已经很难见到它的身影了。 影子分页技术与基于日志技术相比,优点是实现简单,消除了写日志记录的开销,恢复 的速度也快(不需要 redo 和 undo)。影子分页的缺点就是事务提交时要输出多个块,这使 得提交的开销很大, 而且以块为单位, 很难应用到允许多个事务并发执行的情况——这是它 致命的缺点。
(2)查询处理
SQLite 的查询处理本质上就是一个 SQL 编译器和一个虚拟机。而实现这些功能只用 了十多个文件,整个实现实现简单而有效,但是也存在一些问题。首先,SQLite 字典数据 很简单,实际上它的字典就一个表 sqlite_mater,所有的信息都是通过对 sqlite_master 中 SQL 语句进行解析获取的,而解析一个 SQL 语句,都需要进行词法分析、语法分析、甚 至虚拟机代码的生成。而这一过程是很需要时间的,而且,查询计划也没有重用。其次,查 询优化还比较简单,特别是连接操作,只通过循环来做(MySQL 也一样)。但是,仅仅数万 代码,我们不能对它要求太苛求。
Hale Waihona Puke (1)事务处理事务的核心问题有两个:并发控制和恢复。解决了并发控制和恢复问题的系统,就能允 许它的用户假设程序是原子的(atomically)执行的——好像没有其它的程序同时执行;而且 是可靠的(reliably)——不会产生失败。原子性和可靠性的抽象,则称为事务 (transaction)。其实,事务并不是 DBMS 的专利,任何分布式系统,都面对并发和恢复问 题,而解决的方法就是事务,只不过,我们更常听到 DBMS 中的事务。 并发控制保证事务的原子执行, 它使得交错执行的事务看起来是一个接一个的顺序执行 的,完全没有交错执行。如果交错执行的结果与顺序执行的结果一致,则称为串行化 (serializable)。 恢复使得数据库仅仅包含那些正常完成的事务的结果。 如果事务在执行的过程中发生错 误,不能继续进行,恢复算法必须清除部分完成事务产生的影响。 并发控制
浅谈 SQLite:实现与应用
1、前言............................................................................................................................................... 1 2、实现与应用................................................................................................................................... 2 (1)事务处理................................................................................................................................ 3 (2)查询处理................................................................................................................................ 4 (3)存储模型................................................................................................................................ 4 (4)缓冲区管理............................................................................................................................ 5 (5)I/O........................................................................................................................................... 5
(3)存储模型
SQLite 的文件物理上被划分成相同大小的块;逻辑上划分成一些 B-Tree——每个表对 应一个 B-Tree。而没有像 Oracle,或者 InnoDB 对数据块进行复杂的逻辑组织,这种按 需分配数据块的做法必然影响磁盘的读写性能。不过,归根到底,还是源于它的应用场景。
(4)缓冲区管理
可以发现用的 SQLite 3.6.16.1。 据说, Google 在它的 Desktop for Mac, Google Gears, 以及 Android, 甚至 Chrome 中都用到 SQLite,而且,Google 的工程师对 SQLite 的全文检索功能作了很大的贡献 (contribution)。还有 Apple,Micorsoft,SUN 等等,这里就不列举了。详细见 /famous.html。有这些公司的参与,对 SQLite 的发展应该有很 大的帮助,尤其是像 Google 这样的用户。
2、实现与应用
下面从实现及应用的角度来谈谈 SQLite,先看看 SQLite 的特点(功能)吧。 特点 简单(simple):SQLite 是一个非常轻量级自包含(lightweight and self-contained) 的 DBMS:一个头文件,一个动态库文件,你就拥有了关系数据库的所有功能了。简单, 是 SQLite 最明显的哲学。它提供的 API 少而简单。只需要一个 DLL 文件,你的程序马上 就拥有了一个功能强大的数据库引擎,这是一件很美妙的事。 小巧(small):我用 VS 2005 在 Windows 下编译的 3.6.11,Release 版为 368K, 用时不到 20 秒——而编译 MySQL 时,要花上几分钟。而当我插入 10000 条 int 数据时, 内存开销 660K,磁盘开销 92K。 事务(transaction):事务是现代商业数据处理系统最基本的要求,而 Access,不论 是在可执行文件大小(看了一下 Access2003 的可执行文件大小为 6.32M,两者不是一个 量级),还是事务特性,都是不能和 SQLite 相比的。 并发性(Concurrency):由于 SQLite 通过 OS 的文件锁来实现库级锁,粒度很大,但 是,它通过一些复杂特殊的处理(具体可以参见分析系列),尽量的提升了读写的并发度。如 果你还有担心,你可以看看这篇文章: /database/sqlite_cms.html。
(5)I/O
SQLite 采用简单的阻塞 I/O,较新的版本将异步 I/O 作为可选的扩展,但是,由于 SQLite 没有日志,所以,事务中 ACID 中的 D,就无法保证,所以,如果你的数据很关键, 请不要用 SQLite 的异步 I/O。 另一方面, 实际上, 很多嵌入式操作系统, 比如 Windows CE 并不支持异步 I/O(不过,这可以通过多线程加以解决)。 但是,这些“缺点”并不是 SQLite 的缺点,相对于通过 DBMS,恰恰是它的优点,这样 的实现简单, 而且对资源的需求较低。 对嵌入式设备、 或者那些要求较低的应用, 已经足够, 足够就好。 应用场景 嵌入式设备:这应该是 SQLite 应用的主要场景,很多公司都在他们的嵌入式应用程序 中使用 SQLite,其中不乏 google 的 Android。 桌面应用:如果你已经厌恶了 fopen,fread,fwrite 这些函数,SQLite 是你不错的 选择,它接口简单,而且支持事务。前些天无意中下了一个 cookie 清除软件 ——CookieCrumbler,打开一看,发现里面竟然有一个 sqlite3.dll,着实让我震惊了一 把。 Websites:如果你的站点的访问量、数据量小的个人站点,SQLite 可以代替开销较 大的 MySQL 和繁杂的 Access。
1、前言
有一些日子没有仔细关注 SQLite 了,今天打开其主页,发现其最新的版本已经是 3.6.22 了,更让我惊喜的是它的用户越来越多,而且邮件列表的关注者也越来越多,突然 觉得自己已经太 old 了。惊喜的同时,不得不聊上几句了。 首先,来看看都有哪些人在使用 SQLite,主页上列举一长串 NB 的用户,其中不乏像 Adobe,Apple,Firefox,甚至连 google,Microsoft,SUN 这样的用户。 Firefox:这是我的机器上 V3.5.7 安装目录下的文件:
最近因为学校那个项目, 也在搞数据库方面的东西,以前也用过 SQLITE 的东西, 拿来复习下 Sqlite 是一个面向嵌入式系统的数据库,编译完成只有 200K,同时支持 2T 的数据记录。对于嵌入式设备是一个 很好的数据库引擎。本文通过一个小例 子说明如何在 C 与 C++调用 Sqlite API 完成数据库的创建、插入数据与查询 数据。本文的开发环境为(Redhat9.0 + Qtopia2.1.2 + Sqlite3) 安装 Sqlite3: 从 上下载 Sqlite3.2.2 运源代码,依照 Readme 中的步 骤: tar xzf sqlite3.2.2.tar.gz mkdir bld cd bld ../sqlite3.2.2/configure make make install 然后在 shell 下运行 sqlite3 test.db 命令可以检验是否已经安装成 功。 创建数据库: sqlite3 *pDB = NULL; char * errMsg = NULL; //打开一个数据库,如果改数据库不存在,则创建一个名字为 databaseName 的数据库文件 int rc = sqlite3_open(databaseName, &pDB); if(rc) { cout << " Open the database " << databaseName << " failed"