无响应请求了解瓶颈(Flask+Oracle+Gunicorn)

2024-05-16 18:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Flask/Gunicorn的新手,对SQL有非常基本的理解。在

我有一个Flask应用程序,它通过cxu oracle连接到远程oracle数据库。根据选择的应用程序路由,它将运行两个查询之一。我使用gunicorn -w 4 flask:app运行应用程序。第一个查询是对大约70000行的表的一个简单查询,响应非常快。第二个更复杂,它查询多个表,其中一个表包含大约1.5亿行。通过散布print语句,我注意到有时第二个查询甚至永远不会启动,特别是如果它不是用户选择的第一个app.route,并且它们都要同时运行的话。多次打开app.route('/')将多次快速触发其查询并并行运行,但不能与app.route('/2')一起运行。我启用了多个worker,并为oracle启用了threaded=True。为什么会这样?它是否注定会因为表的大小而缓慢/完全无响应?在

import cx_Oracle
from flask import Flask
import pandas as pd

app = Flask(__name__)

connection = cx_Oracle.connect("name","pwd", threaded=True)

@app.route('/')
def Q1():
    print("start q1")
    querystring=""" select to_char(to_date(col1,'mm/dd/yy'),'Month'), sum(col2)
        FROM tbl1"""
    df=pd.read_sql(querystring=,con=connection)
    print("q1 complete")

@app.route('/2')
def Q2():
    print("start q2")
    querystring=""" select tbl2.col1, 
        tbl2.col2, 
        tbl3.col3 
        FROM tbl2 INNER JOIN 
        tbl3 ON tbl2.col1 = tbl3.col1
        WHERE tbl2.col2 like 'X%' AND
        tbl2.col4 >=20180101"""
    df=pd.read_sql(querystring=,con=connection)
    print("q2 complete")

我尝试过将每个查询的数据集导出为csv,并让pandas读取csv,在这个场景中,两个读取都可以并发运行,而且不会错过一个节拍。这是SQL问题、线程问题还是工作线程问题?在


Tags: importapp应用程序flasksqlconnectionroutecol2
1条回答
网友
1楼 · 发布于 2024-05-16 18:24:38

请注意,连接一次只能处理一件事。如果连接忙于执行其中一个查询,则无法执行另一个查询。两个取数操作在一个可以开始执行之前,另一个可以开始执行。要解决这个问题,您应该使用会话池(http://cx-oracle.readthedocs.io/en/latest/module.html#cx_Oracle.SessionPool),然后在每个路由中添加以下代码:

连接=池.获取()

这些都无助于一个查询的性能,但至少可以防止它的干扰!在

相关问题 更多 >