【问题标题】:cx_Oracle.DatabaseError: ORA-12592: TNS:bad packetcx_Oracle.DatabaseError: ORA-12592: TNS:bad packet
【发布时间】:2020-10-15 18:33:56
【问题描述】:

我正在编写一个 Flask API,并且在负载测试时看到很多失败。

查看 uwsgi 日志,我看到一些看起来有点讨厌的东西,那就是:

cx_Oracle.DatabaseError: ORA-12592: TNS:bad packet

oracle 连接正在工作,因为我没有看到完全失败,但这似乎是在大多数情况下过早终止 http rest 调用的原因。

这是什么原因造成的?我正在使用 RHEL,带有 cx_Oracle 7.23,连接到 12C 数据库。我正在使用 Oracle 瘦客户端。

Exception on /api/read/maa [GET]
Traceback (most recent call last):
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/decorator.py", line 48, in wrapper
    response = function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/uri_parsing.py", line 144, in wrapper
    response = function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/validation.py", line 384, in wrapper
    return function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/parameter.py", line 121, in wrapper
    return function(**kwargs)
  File "./registrations.py", line 58, in read_maa_non_passive
    for row in cursor_ariel.fetchall():
cx_Oracle.DatabaseError: ORA-12592: TNS:bad packet
Getting data and status code

----更新---------

当我停止 cx_Oracle 中的连接池时,我的所有问题都消失了。我最初有一个跨 Flask 应用程序共享的 Oracle 连接。这让我在压力测试中失败了。所以我试着聪明一点,使用 SessionPooling 并在每次服务调用时获取连接并释放它们。最后,我回到“糟糕的做法”,为每个函数调用(api 端点)创建一个与 Oracle 的全新连接,现在我在 Locust 的压力测试中获得 100% 的成功率,即使对于 30mb 的较大响应调用也是如此json 有效负载。

【问题讨论】:

标签: python oracle rhel cx-oracle


【解决方案1】:

对于没有/尚未阅读评论线程的人,解决方案是使用threaded=True 启动池。

How to use Python Flask with Oracle Database

【讨论】:

    【解决方案2】:

    能否请您与普通客户进行测试并返回结果?

    即时客户端是常规客户端的子集。

    【讨论】:

    • 如果我开始添加其他 Oracle 客户端,经验告诉我我在自找麻烦
    • 老实说,我现在有一个解决方案,它适用于这个内部 BI 应用程序的规模......据我所知,unixODBC 驱动程序是来自 EasySoft 的商业驱动程序
    • 另外,关于 Flask 和 cx_Oracle 的官方 Oracle 教程告诉您使用即时客户端。 blogs.oracle.com/opal/…
    • 不要尝试使用“常规”客户端 - 库与 Instant Client 中的库相同。关于不合并,没有它你不会得到好的性能。启动池时是否使用了线程模式?您能否详细描述一下您的负载测试,以便我们更好地了解您在做什么、数据类型和容量等。使用新的 Oracle Instant Client,例如19c.
    • 因为在 Windows 和 Linux 上也有官方的 Oracle ODBC 驱动程序可用 - 请参阅 linux 常见问题解答关于 Linux 和 Unix 上的 Oracle ODBC 驱动程序(文档 ID 1338404.1),您可以尝试包含 Oracle ODBC 驱动程序的常规客户端- 或带有额外 Oracle ODBC 的即时客户端 - 都使用 Python ODBC 接口(在 Windows 和 Linux 上测试过)。这有效,您获得了除 pyodbc 等之外的受支持的产品堆栈。由于 Oracle ODBC 驱动程序是使用 Oracle 调用接口 (OCI) 构建的,并且自 Oracle8 22 年以来一直在开发,您可以在 ODBC、OCI、Oracle 网络级别上执行跟踪。跨度>
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2021-09-10
    • 2020-07-29
    • 2017-09-01
    相关资源
    最近更新 更多