我们曾经弃用SQLite的理由,好像逐渐不成立了……
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
过去二十年里,SQLite长期被视作适用于测试环境、移动端应用和快速原型开发的数据库。等到项目正式落地,大家就会把它换掉。但这种固有认知正在悄无声息地被打破。2026年,一波新工具、新架构模式的出现,加上开发者们开始重新审视绝大多数应用的真实需求,已经推动SQLite以惊人的规模投入了生产环境。 本文并非主张SQLite可以在所有业务场景下取代PostgreSQL,而是针对一类应用场景:例如读取密集型服务、多租户SaaS产品、边缘部署场景、嵌入式JVM工具。坦白说,在这类场景中SQLite已经成为了更优选择。随着Turso这类平台、Litestream等工具的出现,以及Ruby on Rails、Spring Boot等主流框架的原生支持,嵌入式数据库和生产级数据库之间的差距,已经缩小到多数开发者难以想象的程度。 ![]() 资料来源: DEV社区《SQLite复兴(2026)》; ByteIota Edge生产报告;Turso/Neon免费套餐文档 一、为什么我们曾经弃用SQLite的理由逐渐不成立 长期以来,大家不建议在服务端使用SQLite的理由始终是固定的几条:单写并发、不支持网络访问、没有用户管理、ALTER TABLE支持有限以及不支持数据复制。这些批评在过去完全合理,部分限制至今也仍然成立。SQLite的设计初衷可以追溯到2000年,当时它所处的环境没有网络、没有多进程访问,也不需要7×24全天候高负载运行。 但从2024年开始,一个核心观点开始在技术博客圈广泛传播:正如Stephen Margheim在一场广为流传的Rails技术分享中所说,SQLite是一个为2004年的硬件环境所设计的数据库,如今却运行在2025年的设备上。固态硬盘(SSD)已经从根本上改变了I/O的成本模型。在NVMe存储上开启WAL模式后,SQLite在单个节点上可以实现每秒1万到5万次的持续写入。这和同一台机器上调优后的PostgreSQL实例性能相当。此外,与SQLite的默认日志模式相比,在高并发负载场景下启用WAL模式可以将p99写入延迟降低30%到60%。这根本不是一个玩具数据库所能达到的性能水平,这个指标足以覆盖绝大多数Web应用的需求。 此外,生态系统也发生了变化。过去需要独立数据库服务才能提供的能力,如今要么已经内置为SQLite扩展,要么可以通过轻量封装层实现。这彻底改变了技术选型的权衡逻辑。 先把实话说在前头:SQLite本质上仍然是单文件数据库。如果你的应用确实存在多进程高并发写入的需求 :比如实时竞价、高频事件流处理或者是多写端分布式系统,那么PostgreSQL或者MySQL依然是更合适的选择。本文接下来的内容,主要面向绝大多数不属于这类场景的应用。 二、彻底改变格局的生态体系 SQLite的再度崛起,并非某一款工具突然走红,而是多个独立项目同步走向成熟,共同补齐了SQLite真正的短板,同时又没有丢掉它简洁易用的核心优势。 LibSQL是Turso团队基于SQLite开发的开源分支版本。它完全兼容SQLite原有API ,同时新增了以往难以实现的能力:支持通过HTTP和WebSocket访问的服务端模式、可从远程主库自动同步的嵌入式副本、基于MVCC与BEGIN CONCURRENT实现的多写支持、面向AI与RAG场景的原生向量搜索,以及更完善的ALTER TABLE功能。更关键的是,Turso基于LibSQL之上构建了全托管云服务,支持创建无限量数据库(由于采用文件而非进程形式,因此不存在冷启动问题),并提供十分慷慨的免费套餐:每月9GB存储空间与5亿行数据读取量。 该方案带来的架构模式极具优势:每个用户、租户或是AI智能体,都可以拥有专属的独立SQLite数据库。数据读取在本地副本执行,延迟可低至微秒级;写入操作则会同步至远端主库。这套架构不用管理连接池,没有缩零后再扩容的性能损耗,租户之间也不存在共享状态的竞争问题。对于多租户SaaS应用而言,这种单租户单数据库的SQLite架构,在运维复杂度上远低于PostgreSQL常用的单库多Schema或行级隔离方案。 Litestream由Ben Johnson开发,可以说是SQLite生态中最被低估的工具。它以Sidecar模式运行,持续追踪SQLite的WAL,并将数据变更实时同步至兼容S3协议的对象存储中。数据恢复只需从同步流中还原即可:支持时间点恢复、极低的恢复点目标(RPO)、多环境复制等能力,全程无需运行独立数据库服务器。很多团队想享受SQLite极简运维的优势,却又需要可靠的灾备方案,而Litestream恰好完美补齐了这块短板。 以下是一个精简版Litestream配置示例:
就是这么简单。Litestream会自动处理WAL日志追踪、S3上传、数据压缩与保留策略。数据恢复也只需要一条命令即可完成。结合SQLite自身的ACID特性,以及WAL模式带来的数据持久化能力,这套方案已经达到生产级备份标准,其简洁程度甚至超过很多PostgreSQL的备份部署方式。 Cloudflare D1于2024年4月正式全面上线,支持在Cloudflare全球节点网络中自动实现读副本。SQLite直接内嵌在Workers运行时中,开发者通过绑定接口进行操作,不用接触数据库文件或编写连接字符串。性能测试显示,在 50 万行数据规模的表中,D1的查询性能达到主流无服务器版PostgreSQL服务的3.2倍。对于Cloudflare Workers 用户而言,D1是自然而然的首选方案:数据库与计算服务同节点部署,消除了跨地域网络往返带来的性能损耗,解决了无服务器数据库常见的性能痛点。 ![]() 来源: DEV 社区 — SQLite 的复兴(2026 年 2 月)。数据为 p50 基准测试结果;请务必使用您自己的工作负载进行验证。 三、从JVM视角上看:Spring Boot及更多场景下的SQLite SQLite的复兴浪潮中,JVM生态几乎是最被忽视的领域。Java和Kotlin开发者以往做嵌入式数据库时,开发环境一般用H2或HSQLDB,到生产环境再切换成 PostgreSQL。但SQLite如今已是极具竞争力的替代方案,而且不仅能用在测试环境中,生产环境同样稳定可靠。 xerial/sqlite-jdbc驱动(GitHub Star超过3000,最新版本为2025年11月发布的 3.50.x 系列)提供了标准JDBC接口。从Hibernate 6开始,hibernate-community-dialects已内置SQLite方言支持,这意味着Spring Boot + JPA集成SQLite非常简单直接。由于SQLite是进程内运行,没有Socket、没有独立服务、也无需鉴权层 ,因此读写操作可直接通过JVM访问磁盘上的数据库文件。 下面是一份可直接运行的Spring Boot + SQLite application.properties配置示例:
sqlite-jdbc的Maven依赖配置如下:
SQLite在JVM生态中有以下适用场景:
在JVM上使用SQLite有一个必须注意的坑:SQLite采用连接级别的锁机制,这意味着如果搭配HikariCP连接池,并且多线程同时执行写入操作,不做精细配置就会频繁出现SQLITE_BUSY错误。实际解决方案是:设置PRAGMA busy_timeout=5000,同时控制写入并发量,或是所有写入请求统一走单一连接。但如果你的JVM服务存在高并发写入场景,PostgreSQL依旧是更合适的选择。 ![]() 数据来源: DEV社区SQLite Renaissance基准测试(2026年2月)。数据为报告范围的代表性中值。 四、多租户架构的变革 除了纯粹的性能优势,SQLite在2026年带来的一大架构变革,就是每个租户一个数据库架构。传统基于PostgreSQL的多租户应用,通常采用两种方案:要么共用数据表、通过tenant_id字段做隔离;要么为每个租户单独创建Schema。两种方案都要做好查询隔离、行级权限管控,连接池也需适配各租户的负载压力。 借助SQLite与Turso,每个租户可以直接拥有数据库文件。这种隔离是物理结构级的,而非逻辑层面。某个租户的慢查询不会影响其他租户的数据读取。数据备份、版本迁移乃至数据删除(比如遵循《通用数据保护条例》GDPR的相关需求)都变得极为简单,直接操作单个文件即可。Turso免费版支持创建无限数量的数据库,即便是服务数万名租户,该架构也能有效控制成本。 这种方案尤其适合处于增长初期的SaaS产品。传统PostgreSQL要实现完善的多租户隔离,运维成本往往远高于实际业务负载。正如Turso所言,目前不少团队不仅将该模式应用于SaaS业务,还落地到AI智能体架构中:为每个智能体分配独立数据库,用于状态追踪、记忆存储与任务协同,完全规避资源争抢问题。 五、SQLite与PostgreSQL:实用选型指南 与其简单判定SQLite和PostgreSQL到底谁更好,不如明确各自更适合的场景。下表观点均基于2026年当下真实的架构现状总结而成。
六、真正实用的性能调优 SQLite默认配置是针对2004年的硬件优化的,数据持久化方案也偏向保守。好在只需执行短短五行SQL语句,就能将其调优至适配现代生产环境。建议通过连接池的初始化脚本,在每次新建连接时自动执行以下编译指令(PRAGMA):
这些配置安全可靠、文档完善,也是Ruby on Rails、Django、Go等技术社区在生产环境使用SQLite时公认的最佳调优方案。这里重点说明synchronous=NORMAL配置:开启该模式后,数据会在WAL检查点完成后持久化,但并非每一笔事务提交都立即落盘。在SSD上这是非常合理的取舍:宕机时数据库依然保持一致,只有在极端断电情况下,可能会丢失最近几秒内的事务。如果搭配Litestream做WAL实时流式备份,这种极端情况也能避免。 补充:SQLite官方文档显示,在存储大二进制对象(BLOB)时,它比直接读写文件系统快35%;而且整个SQLite库体积不足600KB。对于嵌入式工具、命令行应用和资源受限环境,它几乎没有对手。 七、完善整个生态的周边工具 这是一款基于虚拟表实现向量相似度检索的轻量级SQLite扩展。它采用C语言编写且无外部依赖,可在SQLite支持的所有环境(包括WASM)中运行。对于需要开发AI功能或搭建RAG流程,但又不想单独部署一套向量数据库的团队来说,这个扩展非常值得一试。
这是一款基于FUSE实现的SQLite复制组件,专为Fly.io部署环境打造。数据复制对应用完全透明,适用于部署在Fly.io、读请求居多且写入吞吐量不超过约每秒100次的应用。该工具开源,支持自行部署。
除了目前已投入生产使用、基于C语言开发的LibSQL之外,Turso还在从零开始用Rust重写SQLite ,项目代号为Limbo(目前处于Beta阶段)。该版本原生支持多版本并发控制(MVCC)以实现并发写入、异步优先架构以及WASM运行环境。它目前还不建议用于生产,但指明了SQLite生态未来的发展方向。
如果团队需要基于Raft共识算法的多主分布式SQLite,rqlite和dqlite是业内主流选择。二者牺牲了SQLite原本的简洁特性,换取多节点写入能力。当单主架构的SQLite无法满足业务需求,且不愿全面迁移至其他数据库时,可以考虑采用这两款工具。
八、什么时候该放弃SQLite 知道SQLite不适合什么场景,与知道它适合什么场景同样重要。如果出现以下情况,就说明你的业务已经超出了SQLite的能力范围:
此外,如果团队已具备成熟的PostgreSQL运维能力,仅为小幅性能提升而迁移数据库,往往得不偿失。 简单总结:
特别重要的一点:不要把“它只是 SQLite”和“它无法用于生产环境”混为一谈。时至今日,这种观点早已站不住脚。 九、我们学到了什么
该文章在 2026/7/6 10:21:43 编辑过 |
关键字查询
相关文章
正在查询... |