python - cx_Oracle SessionPool 所有 Flask 问题的根源
问题描述
我通过 uwsgi 在 Flask 中创建了一个 Web 服务。我想我会遵循良好的做法并创建一个具有 20 个连接的 SessionPool 以确保安全。每次调用 Web 服务端点时,我都会从池中获取一个连接,并在最后释放它。
当使用 Locust 对 API 进行 swarm 测试时,我遇到了数百次失败,其中一些较长的响应(30Mb JSON 响应)几乎 100% 失败。较小的有效载荷要好得多,但会出现间歇性故障。
当我切换回糟糕的做法并在方法本身内创建一个全新的连接和光标时,我所有的问题都消失了。1000 次压力测试电话 100% 成功。
我的错误是多种多样的。TNS 坏包,来自池的连接数不正确,请求被用户取消....你的名字,它就在那里。
所以我似乎不能使用带有flask的Oracle连接池,或者在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
.
推荐阅读
- java - 根据权重值和距 0,0 的距离从选项中获取输出
- python - 使用python3通过循环创建新文件
- node.js - typeorm 不会更新实体,但会给出成功响应
- google-sheets - 在 Google 表格中的查询中添加“填充”列
- overflow - 如何解决此错误:“RuntimeWarning:在正方形中遇到溢出”
- node.js - 我部署的 MERN 应用程序无法从其他设备上的后端服务检索数据
- javascript - 未捕获的错误:语法错误,使用 replaceWith 时无法识别的表达式
- javascript - Shopify 导航栏在窗口调整大小时压缩
- bash - 要求 bash 排序 -n 选项说明
- puppeteer - 通过 puppeteer 监听自定义事件