您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 深入理解SQLite3系列重点讲义资料
深入理解SQLite3系列(一)目录偶然一次机会接触SQLite3,十万行左右的代码,小巧简洁,速度快,源码公开可以修改。用到了语法分析,涉及数据的实现和B+的知识,跨平台,线程安全等知识,闲来无事分析一下源码。一来,可以大大增加自己的内力。二来,可以为需要了解和学习SQLite3的人们提供帮助。三来,感觉研究生毕业论文写的水平不高,没有能够锻炼自己系统的研究和分析问题的能力。正好借这个机会系统的分析一下SQLite3,锻炼和增强自己的系统研究和分析问题的能力。再次感谢D.RichardHipp大师的无私奉献!Lifeisgiveandforgive.Mayallyoupushedispoped.计划从一下几个方面研究1,SQLite3简介2,SQLite3入门3,关系数据基础4,SQLite3的基本架构5,SQLite3设计和概念6,SQLite3API7,SQLite3SQL语法8,语法分析和Lemon9,代码生成10,虚拟机和VDBE11,SQLite3的数据组织和B+树12,SQLite3页面管理和缓存13,SQLite3锁机制14,SQLite3的存储模型15,专题讨论今天先列一个目录,后边按照计划一步一步研究。希望通过我的一步一步的研究,您能深刻的理解数据库的设计,帮助您设计您自己的数据库。一、SQLite3简介1.SQLite介绍自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。SQLite是一个开源的嵌入式关系数据库,它在2000年由D.RichardHipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。SQLite的当前最新版本是SQLite3.6.20。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。2.SQLite的特点(SQLite’sFeaturesandPhilosophy)零配置(ZeroConfiguration)SQlite3不用安装,不用配置,不用启动,关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,再下次使用数据库的时候自动恢复。可移植(Portability)它是运行在Windows,Linux,BSD,MacOSX和一些商用Unix系统,比如Sun的Solaris,IBM的AIX,同样,它也可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,PalmOS,Symbin和WindowsCE。紧凑(compactness):SQLite是被设计成轻量级,自包含的。一个头文件,一个lib库,你就可以使用关系数据库了,不用任何启动任何系统进程。简单(Simplicity)SQLite有着简单易用的API接口。可靠(Reliability):SQLite的源码达到100%分支测试覆盖率。SQLite3.6.19总共65.7KC代码,但是测试的代码和脚本有45409.7K,是源代码的690倍。SQLite做过如下方面的测试:压力测试100%的分之测试上百万的测试用例内存溢出测试I/O出错测试系统崩溃和断电测试模糊测试边界值测试回归测试异常数据库测试大量的使用assert()和runtime检查使用Valgringd做过分析静态分析SQLite是一个开源的数据库,给人们的印象是没有经过充分的测试,但是事实不是这样的,SQLite3在上边提到的方面都做了详尽的测试。关于SQLite3的更多测试信息,请参考支持事务SQLite3支持事务,即使在系统崩溃或者突然断电的情况下SQLite仍然可以保持原子性、一致性、隔离性和持久性(ACID)。a)事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。b)事务的一致性是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。c)事务的独立性是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致。d)事务的持久性是指事务运行成功以后,就系统的更新是永久的.不会无缘无故的回滚。SQLite3中,即使在一个事务中正在往磁盘写入数据的时候程序崩溃、操作系统崩溃或者突然断电的情况下,写操作要么任务完全执行,要么相当于根本没有执行。SQL92标准实现了大部分SQL92标准。3.SQLiteVersion3的一些新特点:SQLite的API全部重新设计,由第二版的15个函数增加到88个函数。这些函数包括支持UTF-8和UTF-16编码的功能函数。改进并发性能。加锁子系统引进一种锁升级模型(lockescalationmodel),解决了第二版的写进程饿死的问题(该问题是任何一个DBMS必须面对的问题)。这种模型保证写进程按照先来先服务的算法得到排斥锁(ExclusiveLock)。甚至,写进程通过把结果写入临时缓冲区(TemporaryBuffer),可以在得到排斥锁之前就能开始工作。这对于写要求较高的应用,性能可提高400%。改进的B-树。对于表采用B+树,大大提高查询效率。SQLite3最重要的改变是它的存储模型。由第二版只支持文本模型,扩展到支持5种本地数据类型。总之,SQLiteVersion3与SQLiteVertion2有很大的不同,在灵活性,特点和性能方面有很大的改进。SQLite3入门1、SQLite3下载SQLite的最新版本为SQLite3.6.20,下载官方网站为。Windows的源码下载地址:,Linux的源码下载地址:。这这两个是推荐的源码。文档地址:。2、SQLite3的编译下边分别就Windows和Linux平台的静态库和动态库的编译进行说明。静态库和共享库都是一个obj文件的集合,但静态链接后,执行程序中存在自己所需obj的一份拷贝,而动态链接后,执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件,在链接后其所有代码被加载,不管需要的还是不需要的。似乎可以得出一个结论:静态链接后的程序比动态链接的所用存储空间大,因为执行程序中包含了库中代码拷贝;而动态链接的程序比静态链接的所用的运行空间大,因为它将不需要的代码也加载到运行空间。1)Windows平台的编译下边以VS2005为例子讲解SQLite3的编译。静态库的编译a)下载SQLite3.6.20的源代码,解压sqlite-amalgamation-3_6_20.zip到sqlite-amalgamation-3_6_20目录。b)打开VS2005,新建一个VC++类型的项目,选择Win32控制台应用程序。c)输入项目名称为SQLite3620,确定。下一步。d)选择静态库,去掉”预编译头文件”的选项。确定。e)项目》添加现有项,选择刚才解压的sqlite-amalgamation-3_6_20目录中的三个源文件sqlite3.c、sqlite3.h和sqlite3ext.h。f)生成项目。OK,大工告成。g)去你的debug或者release目录去找你的lib去吧。h)简单吧,现在你已经有了一个SQLite3的关系数据库的lib。动态库编译a)下载SQLite3.6.20的源代码,解压sqlite-amalgamation-3_6_20.zip到sqlite-amalgamation-3_6_20目录。b)打开VS2005,新建一个VC++类型的项目,选择Win32控制台应用程序。c)输入项目名称为SQLite3620,确定。下一步。d)选择DLL,去掉”预编译头文件”的选项。确定。e)项目》添加现有项,选择刚才解压的sqlite-amalgamation-3_6_20目录中的三个源文件sqlite3.c、sqlite3.h和sqlite3ext.h。f)生成项目。OK,大工告成。g)去你的debug或者release目录去找你的dll去吧。h)简单吧,现在你已经有了一个SQLite3的关系数据库的dll。其实Windows上的动态库和静态库的编译没有多大差别,soeasy!2)Linux平台的编译静态库编译a)下载SQLite3.6.20的源代码。b)解压文件,[root]#tar–xzvfsqlite-amalgamation-3.6.20.tar.gzc)进入解压目录,[root]#./configured)[root]#makee)[root]#makeinstallf)到/usr/local/lib/即可以找到libsqlite3.a。动态库编译细心的读者在编译lib的的时候应该已经注意到我们刚才在编译lib的时候已经借助autoconf/automake工具生成了so文件。同样在/usr/local/lib/下可以发现libsqlite3.so。关于autoconfi/automake的详细信息可以参考这里。如果不借助与autoconf和automake这样的工程管理工具,Linux系统静态库和动态库的编译可以参考如下方法:静态库的编译,实际上是一个将.o文件打包的过程。gcc–csqlite3.c–osqlite3.oar-rcsqlite3.asqlite3.o#将sqlite3.o编译成静态库sqlite3.a动态库的编译,使用gcc-fPIC-shared编译选项。gcc-fPIC-shared-osqlite3.sosqlite3.o#将sqlite3.o编译成动态库sqlite3.so。3)SQLite3的应用实例下边就不详细区分操作系统说明SQLite3的使用了,只使用Windows的lib和Linux的so分别说明SQLite3的使用。应用静态库a)VS2005中新建一个win32控制台空项目,跟编译是一样去掉“预编译头文件”,主要是为了不引入windows的头文件。b)在工程的配置管理》连接器》输入您生成的lib。c)增加test.c,内容如下:#includestd
本文标题:深入理解SQLite3系列重点讲义资料
链接地址:https://www.777doc.com/doc-3199758 .html