SQLite Design and Concepts
API
分为两大类
- core API. 基本的SQL操作
- extension API. 创建自定义的SQL操作。
基本数据结构
需要了解的组成部分有连接、statments、B树、pager。
为了写好SQLite代码,需要了解的基本概念,API、事务和锁。
连接和statments
这两种数据结构和查询语句的基础。一个连接表示对数据库的一个连接,也是一个事务上下文。statments由这些连接产生。statments在内部由VDBE字节码表示。
B-tree and pager
每个数据库连接可以有多个数据库。每一个数据库对象有一个B-tree对象,每一个B-tree对象有一个pager对象。
pager的工作包括把page从磁盘导入到内存中、写数据库、管理事务、处理锁和从crash中恢复等。
一个数据库连接中是在事务中操作,一个数据库连接不会同时有两个事务。
Core API
两种方式来执行SQL语句。
- prepared query. SQLite执行命令的最终方式。包括三个阶段
- preparation
- execution
- finalization
- wrapped query
连接数据库
sqlite3_open()传入:memory:或空字符串作为数据库的名称,会创建内存中的数据库。
如果数据库的pagesize和操作系统的pagesize相同,会提高IO效率。
运行prepared query
- prepation:把字符串转化为VDBE字节码。
sqlite3_prepare_v2()生成sqlite3_stmt句柄,包括编译好的字节码和需要执行命令和迭代结果集的所有资源。 - execution:
sqlite3_step使VDBE单步执行字节码。首次调用会获取某种锁。 - finalization:
sqlite3_finalize()关闭statment,释放相关资源。
使用参数化的SQL
包括两种参数绑定
- positional
- named
使用参数绑定的优势
- 不需要编译,可以执行statment多次。只需要reset,然后重新bind,运行。
- 自动处理好转义字符,避免数据库注入和语法错误。
运行wrapped query
sqlite3_exec()和sqlite3_get_table()
exec()解析命令,识别出单独的语句,并依次处理。
处理错误
sqlite3_errcode()返回最后执行函数的错误码。使用sqlite3_errmsg()提供最后错误的描述。
格式化SQL语句
sqlite3_mprintf().类似sprintf(),%q和%s类似,不过会把每一个单引号变为连续的两个,防止数据库注入。%Q会为字符串首尾加上单引号,空指针会变成NULL
操作控制
使用注册filter或callback函数来达到在特定事件发生时会被monitor,control。
有三个hook函数
sqlite3_commit_hook()sqlite3_rollback_hook()sqlite3_update_hook()wal_hook()(3.7版本中)
使用多线程
shared cache mode:使用多个一个线程来管理多个SQL连接,这些连接共享page cache,降低了server的内存使用。
extension API
事务
事务的生命周期
- 在事务下究竟是什么在运行。
在每个数据连接中的每个数据库对象,有一个B-Tree和pager对象。pager管理事务、锁、缓存、崩溃恢复。 - 事务何时开始,何时结束,何时开始影响其他数据库连接。
可以短到一个语句,可以长到直到你命令终结。一个操作默认在autocommit模式,即每一个命令在一个事务中运行。何时影响和锁的状态有关。
###锁的状态
每一个事务以unlocked,reserved,exclusize锁状态开始
读事务
两次读操作
使用事务:unlocked->pending->shared->unlocked
不使用事务:unlocked->pending->shared->unlocked->pending->shared->unlocked
不适用事务,在两次读之间数据可能会改变
写事务
每一个操作,读或者写,都必须经过unlocked->pending->shared. pending是gateway lock。
reserved state
当要向数据库中写入时,需要从shared到reserved状态。到reserved状态后,可以把改变写到本地缓存,而不是数据库中。
进入reserved状态后,pager初始化rollback journal,是用于回滚和crash recovery的文件。实际是为更改前的数据库内容。
在reserved状态中,需要pager维护三种pages:改变的pages(存在page cache中),未改变的pages(读出的没有改变的page)以及日志pages(不在page cache中,而是在B-Tree改变page前写入joural)。
pending state
pending lock是gateway lock,保证不会有锁从unlocked到shared状态。
exclusive state
此状态下,主要工作是把改变的page从page cache冲入数据库文件。此时pager真正开始改变数据库。
在写入数据库之前,先确保日志文件已经被写入磁盘。
日志是系统崩溃或掉电后,日志是恢复数据库的唯一方法。
日志文件在commit之后才会被清除。
自动提交和效率
自动提交效率不高,因为每个语句都要获取锁。而且语句之间可能会被改变。
调整page cache
转向互斥状态
一般来说,当pager不能存储更多数据时,会从reserved状态转向互斥状态。实际上,有soft limit和hard limit。
soft limit是指page cache首次被占满,此时包括改变的和未更改page的混合。pager会移除未更改的page,如此重复,直到所有的都被更改的page占满。此时page cache都是已更改的page,进入hard limit,不得不转向互斥状态。
cache_size调整page cache的大小。
决定page cache的大小
利用sqlite3_analyer
等待锁
使用busy handler
sqlite3_busy_timeout()
使用正确的事务
写操作使用begin immediate
SQLite Design and Concepts的更多相关文章
- Asp.Net Core 使用 Sqlite 数据库
在Asp.Net Core 使用 Sqlite 数据库 在Asp.Net Core(5.0)项目中使用Sqlite数据库的设置, 1,创建新web项目 2,安装下面的依赖包 Install-Packa ...
- EntityFrameworkCore 试用
引用 EF Core Sqlite Install-Package Microsoft.EntityFrameworkCore.SqlServer 引用 EF Core Tool Install-Pa ...
- ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First
ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...
- Introduction to Windows 8: The Definitive Guide for Developer
<Windows 8应用开发权威指南>介绍 Introduction to Windows 8: The Definitive Guide for Developer 一.封面设计要求及文 ...
- 为 Web 设计师准备的 25+ 款扁平 UI 工具包
Flat UI Kit by Riki Tanone (free) Flat UI Kit (PSD) by Devin Schulz (free) Eerste UI Kit (free) Metr ...
- .Net Core 之 MSBuild 介绍
前言 关于 .NET Core 旧版本的 sdk 介绍可以参看我以前的 这篇 文章. 8 个小时前,.NET Core 项目组释放了 .NET Core 新一轮的 sdk 工具更新,即 RC4 版本 ...
- .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- 漫谈2014年人机交互(CHI)大会
编者按:2014年度以人机交互为主题的顶级会议ACM SIGCHI已经落下帷幕.微软研究院在此次会议的入选论文总数仅次于卡耐基•梅隆大学,位列第二.此次会议中,有哪些创新想法或技术让人眼前一亮?听微软 ...
随机推荐
- 对于MVC中应用百度富文本编辑器问题的解决办法
1.对于应用富文本编辑器post提交表单内容提示有危险的解决办法: [ValidateInput(false)] //文本编辑器的表单提交不用提示危险 [HttpPost] public Action ...
- .Net Task<T>的一种比较神奇的卡死情况(Wait/Result卡死, await能得到结果)
出现的环境.Net4.0 + WebApi1(4.0.30506.0) + Microsoft.Bcl.Async.1.0.168 自己死活看不出原因, 分享出来给大家看看,希望有人能找到问题的关键 ...
- ADO.NET基础巩固-----连接类和非连接类
最近的一段时间自己的状态还是不错的,早上,跑步,上自习看书,下午宿舍里面编程实战,晚上要么练习代码,要么去打球(在不打就没机会了),生活还是挺丰富的. 关于C#的基础回顾就先到前面哪里,这 ...
- git clone 失败问题解决方案
第一次从github上通过终端pull项目,出现了上述问题.询问了后台,才知道原来是电脑公钥(publickey)未添加至github,所以无法识别. 因而需要获取本地电脑公钥,然后登录github账 ...
- C#读取Appconfig中自定义的节点
今天在使用Nlog的时候,发现了一个之前没注意的问题. 以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml. 如果<appSettings>节点中的内容很多的话,我自己 ...
- jQuery动态设置样式List item
前段时间,Insus.NET有修改一个功能<激活当前视图菜单高亮呈现>http://www.cnblogs.com/insus/p/5287093.html 今天Insus.NET想改用另 ...
- 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载
在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...
- ASP.NET 缓存
(一)什么是缓存 缓存是指临时数据或者文件交换区.比方说CPU上的L1或是L2缓存,内存上被划分出来的缓冲区.我们知道CPU的速度是最快的,其次是内存,最后是硬盘,各个部件之间运算速度有很大的差距,但 ...
- SingalR--介绍
什么是SignalR? ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务器等 ...
- 创建Oracle数据库
[root@localhost ~]# su - oracle [oracle@localhost ~]$ sqlplus /nolog SQL> conn /as sysdba; SQL> ...