【问题标题】:Why is SQLite 3 executing select queries one by one in Python?为什么 SQLite 3 在 Python 中一个一个地执行 select 查询?
【发布时间】:2023-02-21 02:22:58
【问题描述】:

我有一个连接到 SQLite 数据库的 python 应用程序。当我点击请求时,它需要大约 450 毫秒来获取 4500 行数据,这是一件很棒的事情。

但是当我有 2 个相同逻辑的 python 应用程序(运行在不同的端口)指向同一个 SQLite 数据库时,当我同时点击两个 python 应用程序的请求时,大约需要 900 毫秒来获取响应。从这里我得出一个结论,即选择查询不是并行执行的,而是一个接一个地执行的。

注意:我不需要写操作。我只需要执行选择查询。

请尽快帮助解决上述问题。

提前致谢

单个请求耗时 450 毫秒。但是当 2 个连接尝试读取数据库时,它会花费两倍的时间。

【问题讨论】:

    标签: python sqlite flask concurrency


    【解决方案1】:

    默认情况下,SQLite3 会在 Python 中一条一条地执行 select 查询,因为 SQLite3 有一个默认的序列化数据库访问行为。这意味着每个读或写操作都在下一个开始之前完成。此行为旨在确保数据一致性并防止多个进程同时访问数据库时可能发生的冲突。

    在 Python 中,当您使用 SQLite3 模块执行 SELECT 查询时,它会打开一个游标对象,允许您一次从结果集中获取一行数据。游标对象执行查询并逐行获取结果。此行为与 SQLite3 的默认行为一致,它对数据库访问进行序列化以确保数据一致性。

    如果你想在 SQLite3 中同时执行多个 SELECT 查询,你可以通过在打开数据库连接时设置 sqlite3.SHARED_CACHE 标志来启用共享缓存模式。这将允许多个进程同时访问数据库,但如果使用不当,也可能增加冲突和数据损坏的风险。或者,您可以使用旨在更有效地处理并发访问的不同数据库系统,例如 PostgreSQL 或 MySQL。

    【讨论】:

      【解决方案2】:

      SQLite 主要用于单用户应用程序,因此并没有像您尝试的那样真正针对并行查询执行进行优化。 您可以切换到具有内置并发访问权限的数据库引擎,如 MYSQL、PostgresSQL 等,以实现您需要的功能并减少获取查询结果的延迟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        相关资源
        最近更新 更多