如何让Flask-SQLAlchemy使用支持usleep()的自编译sqlite?
我正在使用Flask 0.10.1
和Flask-SQLAlchemy 2.1
与Python 3.4.0
一起提供在Ubuntu 14.04
中运行的微服务。作为我的应用程序的数据库后端,我使用SQLite默认设置:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/my-database.db'
SQLite3的已安装版本为3.8.2。
在操作我的服务的过程中,我偶尔会看到以下错误:
Traceback (most recent call last): File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context context) File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute cursor.execute(statement, parameters) sqlite3.OperationalError: database is locked
微服务在很长一段时间内都没有任何数据库连接,所以一开始这个问题对我来说显得莫名其妙。我做了一些研究并发现了文章the SQLite lock timeout nightmare。它表明SQLite可以在没有usleep()
支持的情况下编译,因此可能只尝试以全秒间隔锁定数据库。鉴于SQLite的默认锁定超时为5秒,我们基本上有5次尝试在失败之前尝试数据库连接。 Inspection of my SQLite compile flags还显示未设置HAVE_USLEEP。此外,SQLAlchemy不允许为SQLite设置不同的池超时,因为使用了NullPool
。 我希望用支持usleep()的版本替换SQLite,以减少锁定超时的可能性。怎么办呢?