16 January 2016

SQLite 将数据库引擎嵌入应用,不需要单独运行数据库服务器,适合本地工具、桌面应用和设备中的结构化数据。是否选择它,应看访问方式和并发需求,而不是笼统判断它比其他数据库更快。

用一个小库开始

安装目标平台提供的 sqlite3 命令行工具后,在测试目录执行:

sqlite3 hello.db

随后输入:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO users(name) VALUES ('Alice');
SELECT id, name FROM users;

.tables、.schema users、.databases 是命令行工具的点命令,与提交给数据库的 SQL 不同。不存在的库通常会在实际写入时创建文件,不要只进入 shell 就判断持久化已完成。

主键和类型

INTEGER PRIMARY KEY 通常关联 rowid,可以自动分配整数键。AUTOINCREMENT 有更具体的“不复用曾使用的 rowid”的语义及额外成本,不是普通自动主键的必选项。

SQLite 的类型规则与 MySQL 不完全相同,例如声明 VARCHAR(32) 不等于自动限制字符串长度为 32。业务约束应通过合适的 CHECK、应用校验和目标版本支持的类型机制表达。

并发和文件管理

SQLite 可以支持多个读者,但同一时刻只有一个写者。事务模式、busy timeout 与 WAL 会影响并发体验,不应简单说每次事务都以同一种方式锁住整个文件。

数据库主要保存在一个文件中,但运行时还可能存在 journal、WAL 和共享内存文件。数据库活跃时直接复制主文件,不一定得到完整一致的备份,应使用备份 API 或正确的停写备份流程。也不宜把共享网络盘当成通用数据库服务器替代方案。

在 Java 中使用

Java 可通过 SQLite JDBC 驱动连接 jdbc:sqlite:hello.db,用 try-with-resources 关闭连接、语句和结果集,并使用参数化 SQL。路径、事务边界与多连接写入竞争需要明确。

SQLite 核心没有传统服务器式用户登录管理,不能据此称“免费版没有密码、收费版有密码”。文件访问权限和加密扩展是不同层面,应按部署需要分别处理。

参考:SQLite 适用场景、事务、备份 API。





blog comments powered by Disqus
Fork me on GitHub