SQLite + Flask偶尔需要10-20秒才能返回简单的选择查询

时间:2013-10-16 15:27:01

标签: python sqlite flask

我遇到了一个我构建的小型SQLite + Flask python应用程序的问题。该应用程序通过多个端点提供JSON - 一次不超过150kb。在一些不活动之后,应用程序将花费10-25秒来返回通常在不到1秒内返回的查询。在这10-25秒期间,对应用程序的其他查询同样被阻止。该应用程序永远不会写入sqlite数据库;它只读它。

到目前为止,我已经尝试过:

  1. 创建单例以保持与数据库的单一开放连接,因此不是每个查询都必须重新打开连接。

  2. 将数据库文件本身放在内存文件系统中以加快访问时间。

  3. 增加托管文件的虚拟专用服务器上的内存(现在有大量可用内存,没有任何内容可以交换到磁盘)

  4. 将sqlite数据库的内容加载到内存中的sqlite数据库,并在每次查询时从中读取。

  5. 这些都没有解决问题,而且我已经没有选择了 - 我想解决这个问题并坚持使用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)
    

2 个答案:

答案 0 :(得分:2)

经过多次故障排除后,我发现我错过了我设计的系统的重要组件:一个Web服务器网关接口(wsgi) - 就像gunicorn--处理烧瓶的并发性。没有它,我的开发阶段烧瓶应用程序一次只能处理一个并发请求。

在设置我的烧瓶应用程序以围绕gunciron运行并部署4个异步工作程序来处理并发后,问题似乎立即得到解决。

所有这些都在精心编写的Flask文档中:http://flask.pocoo.org/docs/deploying/

答案 1 :(得分:1)

通常,您应该在网络服务器(例如nginx)后面运行gunicorn,它将充当反向代理。 Nginx接收传入的请求,并根据配置文件确定是否提供静态文件或将控制传递给gunicorn。

解决问题很好!