繁体   English   中英

SQLAlchemy / gevent / cx_Oracle 池大小保持在 1

[英]SQLAlchemy / gevent / cx_Oracle pool size stays at 1

尽管我使用的池大小为 50,但我无法使用 gevent 21.1.2 和 cx_Oracle 8.1.0 获得 SQLAlchemy v. 1.3.22 一次发出多个查询。

我不确定哪个库更重要,因此我添加了所有似乎适用的标签。

我确认我的用户可以与 Oracle 数据库建立多个连接 - 我有另一个程序,我可以使用相同的凭据和数据库轻松地并行运行 50 个查询。

我使用 siege 调用下面的代码——无论我设置什么并发,我总是在池中获得一个连接。

一旦我从“应用程序”处理程序中删除了与 SQLAlchemy 相关的代码,siege 就会报告预期的并发 50,我理解这意味着它实际上一次运行那么多并发连接。

我知道 SQLAlchemy 会按需建立新的连接,但我不明白为什么这里没有这样做,因为显然有需求。

from gevent.monkey import patch_all
patch_all()

from gevent.pywsgi import WSGIServer
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

username = '<hidden>'
password = '<hidden>'
host = '<hidden>'
port = '<hidden>'
database = '<hidden>'

url = 'oracle://{}:{}@{}:{}/{}'.format(username, password, host, port, database)

engine = create_engine(url, pool_size=50)
Session = sessionmaker(bind=engine)

def application(env, start_response):

    session = Session()
    result = session.execute('select 1+1 from dual')
    result.fetchall()
    session.close()

    print('Status:', engine.pool.status())

    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<b>hello world</b>']

if __name__ == '__main__':
    print('Serving on 8088...')
    WSGIServer(('127.0.0.1', 8088), application, log=None).serve_forever()

围城:

siege -r 500 -c 50 http://localhost:8088/

Transactions:                 31 hits
Availability:             100.00 %
Elapsed time:               4.13 secs
Data transferred:           0.00 MB
Response time:              2.60 secs
Transaction rate:           7.51 trans/sec
Throughput:             0.00 MB/sec
Concurrency:               19.50
Successful transactions:          31
Failed transactions:               0
Longest transaction:            4.10
Shortest transaction:           0.00

来自服务器的 Output:

Status: Pool size: 50  Connections in pool: 1 Current Overflow: -49 Current Checked out connections: 0
Status: Pool size: 50  Connections in pool: 1 Current Overflow: -49 Current Checked out connections: 0
Status: Pool size: 50  Connections in pool: 1 Current Overflow: -49 Current Checked out connections: 0

非常感谢!

在顶部添加

import greenify

greenify.greenify()
assert greenify.patch_lib("/usr/lib/oracle/19.5/client64/lib/libclntsh.so.19.1")

但是请调整池大小,否则您的应用程序将面临被严重杀死的风险。 您需要先对其进行测试,您的问题为其提供了出色的脚本。 https://github.com/oracle/python-cx_Oracle/issues/126

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM