You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite连接关闭后、跨Python会话时是否保留查询缓存?

问题

我需要对现有不同数据库开展基准测试,通过重复执行某查询n次来统计平均查询耗时。已知Python的sqlite3模块内部采用语句缓存以避免SQL解析开销,可通过cached_statements参数设置缓存语句数量,默认缓存100条。但我不清楚该缓存的留存规则,有两个疑问:

  1. 在同一Python会话内,关闭连接后缓存是否仍存在?
  2. 缓存是否会写入磁盘,跨Python会话留存?

我的测试代码如下:

times = []
for i in range(n_repeat):
    start = time.perf_counter()
    conn = sqlite3.connect(dbpath)
    # do query
    conn.commit()
    conn.close()
    times.append(time.perf_counter() - start)

return timedelta(seconds=sum(times) / n_repeat)

我原本假设关闭连接后所有缓存会立即被丢弃并回收,且测试中n次运行的耗时差异极小,似乎验证了该假设,但仍希望得到确切结论。简言之:SQLite在连接关闭后是否仍缓存查询?是否跨Python会话缓存查询?

回答
  • 同一Python会话内,关闭连接后缓存会被销毁:Python的sqlite3模块的语句缓存是绑定到单个数据库连接对象的。当调用conn.close()关闭连接时,该连接对应的所有缓存语句都会被立即释放并回收,不会在同一Python会话内留存。你的测试代码每次循环都新建连接再关闭,每次的缓存都是独立的,这也是多次运行耗时差异极小的原因——每次都要重新解析SQL、执行,没有复用缓存。
  • 缓存不会写入磁盘,无法跨Python会话留存:sqlite3的语句缓存是纯内存级别的,仅存在于当前Python进程的内存中,不会被持久化到磁盘。当Python进程结束(会话关闭),所有缓存都会被彻底清除,新启动的Python会话无法复用之前的缓存。

额外补充:如果要在基准测试中模拟缓存复用的场景,应该把连接的创建和关闭放到循环外面,保持单个连接重复执行查询,这样才能利用到cached_statements的缓存效果。

内容的提问来源于stack exchange,提问作者Bram Vanroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:39:27