cx_Oracle 所有 Flask 问题的 SessionPool 根源

cx_Oracle SessionPool root of all Flask problems

我通过 uwsgi 在 Flask 中创建了一个 Web 服务。我想我会遵循良好的做法并创建一个具有 20 个连接的 SessionPool 以确保安全。每次调用 Web 服务端点时,我都会从池中获取一个连接,并在最后释放它。

当使用 Locust 对 API 进行集群测试时,我遇到了数百次失败,在一些较长的响应(30Mb JSON 响应)上几乎 100%。负载越小越好,但会出现间歇性故障。

当我改回不良做法并在方法本身内创建全新的连接和光标时,我所有的问题都消失了。 1000 次压力测试调用 100% 成功。

我的错误是多种多样的。 TNS 错误数据包,来自池的连接数不正确,请求被用户取消....你说的,它就在那里。

所以我似乎无法将 Oracle 连接池与 Flask 一起使用,或者在 Flask 应用程序级别只有一个连接(这会产生错误,不确定为什么,这就是我切换到连接池的原因)。

关于在 Flask 中使用 cx_Oracle 创建可扩展应用程序的任何建议。

我的原始代码是:

pool = cx_Oracle.SessionPool("user", "password", "myserver.company.net:1521/myservice", min=10, max=10, increment=0, getmode=cx_Oracle.SPOOL_ATTRVAL_WAIT, encoding="UTF-8")







def read_products_search(search=None):
    """
    This function responds to a request for /api/products
    with the complete lists of people

    :return:        json string of list of people
    """
    conn_ariel = pool.acquire()   
    cursor_ariel = conn_ariel.cursor()


    search=search.lower()
    print("product search term is: ", search)
    # Create the list of products from our data
    sql = """
        SELECT DRUG_PRODUCT_ID, PREFERRED_TRADE_NAME, PRODUCT_LINE, PRODUCT_TYPE, FLAG_PASSIVE, PRODUCT_NUMBER
        FROM DIM_DRUG_PRODUCT 
        WHERE lower(PREFERRED_TRADE_NAME) LIKE '%' || :search1 || '%' or lower(PRODUCT_LINE) LIKE '%' || :search2 || '%'  or lower(PRODUCT_NUMBER) LIKE '%' || :search3 || '%' 
        ORDER BY PREFERRED_TRADE_NAME ASC
        """
    cursor_ariel.execute(sql, {"search1":search,"search2":search, "search3":search })
    products = []




    for row in cursor_ariel.fetchall():

        r = reg(cursor_ariel, row, False)

        product = {
            "drug_product_id"           :   r.DRUG_PRODUCT_ID,
            "preferred_trade_name"      :   r.PREFERRED_TRADE_NAME,
            "product_line"              :   r.PRODUCT_LINE,
            "product_type"              :   r.PRODUCT_TYPE,
            "flag_passive"              :   r.FLAG_PASSIVE,
            "product_number"            :   r.PRODUCT_NUMBER

        }
        # logging.info("Adding Product: %r", product)
        products.append(product)

    if len(products) == 0:
        products = None

    pool.release(conn_ariel)
    return products

创建池时,使用 threaded=True

How to use Python Flask with Oracle Database