【SQL开源代码栏目提醒】:网学会员在SQL开源代码频道为大家收集整理了“SQLite(轻量级最佳数据库) 原理分析和开发应用 - 学士论文“提供大家参考,希望对大家有所帮助!
SQLite轻量级最佳数据库 原理分析和开发应用 概述 SQLite介绍 自几十年前出现的商业应用程序以来数据库就成为软件应用程序的主要组成部分。
正与数据库管理系统非常关键一样它们也变得非常庞大并占用了相当多的系统资源增加了管理的复杂性。
随着
软件应用程序逐渐模块模块化一种新型数据库会比大型复杂的传统数据库
管理系统更适应。
嵌入式数据库直接在应用程序进程中运行提供了零配置zero-configuration运行模式并且资源占用非常少。
SQLite是一个开源的嵌入式关系数据库它在2000年由D. Richard Hipp发布它的减少应用程序管理数据的开销SQLite可移植性好很容易使用很小高效而且可靠。
SQLite嵌入到使用它的应用
程序中它们共用相同的进程空间而不是单独的一个进程。
从外部看它并不像一个RDBMS但在进程内部它却是完整的自包含的数据库引擎。
嵌入式数据库的一大好处就是在你的程序内部不需要网络配置也不需要管理。
因为客户端和服务器在同一进程空间运行。
SQLite 的数据库权限只依赖于文件系统没有用户帐户的概念。
SQLite 有数据库级锁定没有
网络服务器。
它需要的内存其它开销很小适合用于嵌入式设备。
你需要做的仅仅是把它正确的编译到你的程序。
架构architecture SQLite采用了模块的设计它由三个子系统包括8个独立的模块构成。
接口Interface 接口由SQLite C API组成也就是说不管是程序、脚本语言还是库文件最终都是通过它与SQLite交互的我们通
常用得较多的ODBC/JDBC最后也会转化为相应C API的调用。
编译器Compiler 在编译器中分词器Tokenizer和分析器Parser对SQL进行语法检查然后把它转化为底层能更方便处理的分层的数据结构---语法树然后把语法树传给代码生成器code generator进行处理。
而代码生成器根据它生成一种针对SQLite的汇编代码最后由虚拟机Virtual Machine执行。
虚拟机Virtual Machine 架构中最核心的部分是虚拟机或者叫做虚拟数据库引擎Virtual Database EngineVDBE。
它和
Java虚拟机相似解释执行字节代码。
VDBE的字节代码由128个操作码opcodes构成它们主要集中在数据库操作。
它的每一条指令都用来完成特定的数据库操作比如打开一个表的游标或者为这些操作栈空间的准备比如压入参数。
总之所有的这些指令都是为了满足SQL命令的要求关于VM后面会做详细介绍。
后端Back-End 后端由B-树B-tree页缓存page cachepager和操作
系统接口即系统调用构成。
B-tree和page cache共同对数据进行管理。
B-tree的主要功能就是索引它维护着各个页面之间的复杂的关系便于快速找到所需数据。
而pager的主要作用就是通过OS接口在B-tree和Disk之间传递页面。
SQLite的特点SQLite’s Features and Philosophy 零配置Zero Configuration 可移植Portability 它是运行在WindowsLinuxBSDMac OS X和一些商用Unix系统比如Sun的SolarisIBM的AIX同样它也可以
工作在许多嵌入式操作系统下比如QNXVxWorksPalm OS Symbin和Windows CE。
Compactness SQLite是被
设计成轻量级自包含的。
one header file one library and you’re relational no external database server required 简单Simplicity 灵活Flexibility 可靠Reliability SQLite的核心大约有3万行标准C代码这些代码都是模块化的很容易阅读。
事务Transaction 事务的周期Transaction Lifecycles 程序与事务之间有两件事值得注意 A、哪些对象在事务下运行——这直接与API有关。
B、事务的生命周期即什么时候开始什么时候结束以及它在什么时候开始影响别的连接这点对于并发性很重要——这涉及到SQLite的具体实现。
一个连接connection可以包含多个statement而且每个连接有一个与数据库关联的B-tree和一个pager。
Pager在连接中起着很重要的作用因为它管理事务、锁、内存缓存以及负责崩溃恢复crash recovery。
当你进行数据库写操作时记住最重要的一件事在任何时候只在一个事务下执行一个连接。
这些回答了第一个问题。
一般来说一个事务的生命和statement差不多你也可以手动结束它。
默认情况下事务自动提交当然你也可以通过BEGIN..COMMIT手动提交。
接下来就是锁的
问题。
关于这个图有以下几点值得注意 A、一个事务可以在UNLOCKEDRESERVED或EXCLUSIVE三种状态下开始。
默认情况下在UNLOCKED时开始。
B、白色框中的UNLOCKED PENDING SHARED和 RESERVED可以在一个数据库的同一时存在。
C、从灰色的PENDING开始事情就变得严格起来意味着事务想得到排斥锁EXCLUSIVE注意与白色框中的区别。
虽然锁有这么多状态但是从体质上来说只有两种情况读事务和写事务。
读者可以从http://www.sqlite.org/下载SQLite 3.3.4的版本 Cmd 进入命令行 创建数据库文件: SQLite3 d:test.db 回车 就生成了一个t