非常教程

Sqlite参考手册

其他 | Miscellaneous

An Asynchronous I/O Module For SQLite

注意:将PRAGMA同步设置为NORMAL的WAL模式可避免在事务提交期间调用fsync(),并且仅在检查点操作期间调用fsync()。使用WAL模式很大程度上避免了对这种异步I / O模块的需求。因此,这个模块不再被支持。源代码继续存在于SQLite源代码树中,但它不是任何标准构建的一部分,也不再维护。本文档保留以供历史参考。

通常,当SQLite写入数据库文件时,它会等到写操作完成后再将控制权返回给调用应用程序。由于与CPU绑定操作相比,写入文件系统通常非常缓慢,因此这可能是性能瓶颈。异步I / O后端是一种扩展,它使SQLite使用在后台运行的单独线程执行所有写入请求。虽然这不会减少整个系统资源(CPU,磁盘带宽等),但它确实允许SQLite在写入数据库时​​快速将控制权返回给调用者。

1.0功能

使用异步I / O,写入请求由在后台运行的单独线程处理。这意味着启动数据库写入的线程不必等待(有时很慢)的磁盘I / O发生。写作似乎很快就会发生,尽管实际上它在背景中以通常缓慢的速度发生。

异步I / O似乎提供了更好的响应能力,但价格昂贵。你失去了耐久性财产。使用SQLite的默认I / O后端,一旦写入完成,您就知道您写入的信息在磁盘上是安全的。对于异步I / O,情况并非如此。如果程序崩溃或数据库写入后但在异步写入线程完成之前发生断电,则数据库更改可能永远不会将其写入磁盘,并且数据库的下一个用户可能看不到您的更改。

你失去了异步I / O的耐久性,但你仍然保留着ACID的其他部分:原子,一致和孤立。许多应用程序相处良好,没有耐久性。

1.1它是如何工作的

异步I / O通过创建SQLite VFS对象并将其注册到sqlite3_vfs_register()来工作。当通过这个VFS打开的文件被写入(使用vfs xWrite()方法)时,数据不会直接写入磁盘,而是被放置在由后台线程处理的“写入队列”中。

当使用vfs xRead()方法读取使用异步VFS打开的文件时,将从磁盘上的文件和写入队列中读取数据,以便从vfs读取器的角度来看xWrite()似乎已经完成。

异步I / O VFS通过调用API函数sqlite3async_initialize()和sqlite3async_shutdown()来注册(和未注册)。有关详细信息,请参见下面的“编译和使用”部分。

1.2限制

为了获得有关异步IO的主要想法的经验,这个实现是故意保持简单的。未来可能会添加其他功能。

例如,正如当前实现的那样,如果写操作发生在超过后台写入器线程的I / O能力的稳定流上,未决写入操作的队列将无限制地增长。如果持续时间足够长,主机系统可能会耗尽内存。一个更复杂的模块可以跟踪等待写入的数量,并在等待写入队列变得太大时停止接受新的写入请求。

1.3锁定和并发

使用此异步IO实现的单个进程中的多个连接可以同时访问单个数据库文件。从用户的角度来看,如果所有连接都来自单个进程,那么“正常”SQLite和使用异步后端的SQLite提供的并发性没有区别。

如果启用了文件锁定(默认启用),则来自多个进程的连接也可以读取和写入数据库文件。但并发性降低如下:

  • 当使用异步IO的连接开始数据库事务时,数据库立即被锁定。但是,直到写入队列中的所有相关操作都被刷新到磁盘后,锁才会被释放。这意味着(例如)在发出“COMMIT”或“ROLLBACK”后数据库可能会保持锁定一段时间。
  • 如果使用异步IO的应用程序快速连续执行事务,则其他数据库用户可能会被有效地锁定在数据库之外。这是因为在执行BEGIN时,立即建立数据库锁。但是,当相应的COMMIT或ROLLBACK发生时,只有在写入队列的相关部分被刷新后才会释放锁。因此,如果在刷新写入队列之前COMMIT之后是BEGIN,那么数据库永远不会解锁,从而阻止其他进程访问数据库。

可以在运行时使用sqlite3async_control()API禁用文件锁定(请参见下文)。这可以提高NFS性能或其他网络文件系统的性能,例如避免建立文件锁定所需的服务器同步往返。但是,如果禁用文件锁定时多个连接尝试访问同一个数据库文件,则应用程序崩溃和数据库损坏可能是结果。

2.0编译和使用

异步IO扩展由位于SQLite源代码树的子文件夹中的单个C代码文件(sqlite3async.c)和头文件(sqlite3async.h)组成,该文件定义应用程序用于激活和控制的C API模块功能。 ext/async/

要使用异步IO扩展,请将sqlite3async.c编译为使用SQLite的应用程序的一部分。然后使用sqlite3async.h中定义的API来初始化和配置模块。

在sqlite3async.h中的注释中详细描述了异步IO VFS API。使用API​​通常包含以下步骤:

  1. 通过调用sqlite3async_initialize()函数向SQLite注册异步IO VFS。
  1. 创建后台线程来执行写入操作并调用sqlite3async_run()。
  1. 使用普通的SQLite API通过异步IO VFS读写数据库。

有关详细信息,请参阅sqlite3async.h头文件中的注释。

3.0 PORTING

目前,异步IO扩展与支持pthreads接口的win32系统和系统兼容,包括Mac OS X,Linux和其他各种Unix。

要将异步IO扩展移植到另一个平台,用户必须为新平台实现互斥和条件变量原语。目前没有外部可用的接口来允许这一点,但修改sqlite3async.c中的代码以包含新平台的并发原语相对容易。有关详细信息,请在sqlite3async.c中搜索注释字符串“PORTING FUNCTIONS”。然后实施以下每个版本的新版本:

static void async_mutex_enter(int eMutex);
static void async_mutex_leave(int eMutex);
static void async_cond_wait(int eCond, int eMutex);
static void async_cond_signal(int eCond);
static void async_sched_yield(void);

上述每个函数所需的功能在sqlite3async.c的注释中进行了描述。

 SQLite在公共领域。

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.Appropriate Uses For SQLite
4.Architecture of SQLite
5.Atomic Commit In SQLite
6.Automatic Undo/Redo With SQLite
7.Benefits of SQLite As A File Format
8.Change in Default Page Size in SQLite Version 3.12.0
9.Clustered Indexes and the WITHOUT ROWID Optimization
10.Compile-time Options
11.Constraint Conflict Resolution in SQLite
12.Custom Builds Of SQLite
13.Deterministic SQL Functions
14.Distinctive Features Of SQLite
15.EXPLAIN QUERY PLAN
16.Features Of SQLite
17.File Format Changes in SQLite
18.Full-Featured SQL
19.High Reliability
20.Hints for Debugging SQLite
21.How SQLite Is Tested
22.How To Compile SQLite
23.How To Download Canonical SQLite Source Code
24.Imposter Tables
25.In-Memory Databases
26.Indexes On Expressions
27.Internal Versus External BLOBs
28.Isolation In SQLite
29.Long Term Support
30.Maintaining Private Branches Of SQLite
31.Many Small Queries Are Efficient In SQLite
32.Measuring and Reducing CPU Usage in SQLite
33.Memory-Mapped I/O
34.NULL Handling in SQLite
35.Partial Indexes
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By