我遇到了一个我构建的小型 SQLite + Flask python 应用程序的问题。该应用程序通过多个端点提供 JSON 服务——一次不超过 150kb。在一些不活动之后,应用程序将需要 10-25 秒来返回通常在不到 1 秒内返回的查询。在这 10-25 秒内,对应用程序的其他查询同样被阻止。该应用程序从不写入 sqlite 数据库;它只读取它。
到目前为止,我已经尝试过:
创建一个单例以保持与数据库的单个打开连接,因此并非每个查询都必须重新打开连接。
将数据库文件本身放在内存文件系统中以加快访问时间。
增加托管文件的虚拟专用服务器上的内存(现在有很多可用内存,没有任何东西交换到磁盘)
将 sqlite 数据库的内容加载到内存中的 sqlite 数据库中,并在每次查询时从该数据库中读取。
这些都没有解决问题,而且我已经没有选择了——我想解决这个问题并坚持使用 SQLite,但如果不可能,我将使用 Postgres 重构我的应用程序。
这是读取数据库的烧瓶代码:
@app.route('/filings/<int:year>', methods=['GET'])
@crossdomain(origin='*')
def getFilings ( year ):
if request.method == 'GET':
q = 'SELECT '
for c in Filings.columns:
q = q + c + ','
q = q[:-1] # remove trailing comma
q = q + ' FROM filings'
q = q + ' WHERE filings.date LIKE \'' + str(year) + '%\''
print "about to execute sql query:"
print " " + q
con = lite.connect('/mnt/memfs/filings.db')
cur = con.cursor()
cur.execute(q)
rows = cur.fetchall()
jsonrt = [ ]
for row in rows:
d = { }
x = 0
for c in Filings.columns:
d[c] = row[x]
x = x + 1
jsonrt.append(d)
con.close()
return jsonify(items=jsonrt)