cx_oracle中Connection.ping()的返回值是多少?

men*_*gqi 4 python oracle cx-oracle

我刚刚安装了一个python包?cx_oracle。从cx_oracle 文档中我找到了一个方法:Connection.ping(),它被描述为“Ping 可用于测试连接是否仍然活动的服务器。”。

但是文档没有提到ping().

我写了一些代码来做一个测试:

#!/usr/bin/env python3
import cx_Oracle
conn = cx_Oracle.connect("...")
print(conn.ping()) # display?None
conn.close()
print(conn.ping()) # raise exception: cx_Oracle.InterfaceError: not connected
Run Code Online (Sandbox Code Playgroud)

从测试结果中,我发现如果连接正常或引发异常:连接关闭ping()后将返回。Nonecx_Oracle.InterfaceError: not connected

还有其他可能的返回值吗?为什么不直接返回 True 或 False?

Ben*_*Ben 6

cx_Oracle文档指出这是:

此方法是对 DB API 定义的扩展,仅在 Oracle 10g R2 及更高版本中可用。

但是,此方法未记录在 PEP 249 中 - 当前 Python 数据库 API 规范中的连接方法可选扩展(或其他任何地方)。

PEP 249 的 MySQL 实现也有这个方法;该文件指出:

当连接不可用时,InterfaceError会引发 。使用该is_connected()方法检查连接而不引发错误。

引发InterfaceError错误。

由于这与 cx_Oracle 行为相同,我认为这是您问题的答案,并且您确定的行为是正确的:

  • 如果连接处于活动状态,则没有返回
  • InterfaceError如果连接不活动则引发An

如果我们查看的代码.ping(),它确认这是实现该方法的方式:

static PyObject *Connection_Ping(
    udt_Connection *self,               // connection
    PyObject* args)                     // arguments
{
    sword status;

    if (Connection_IsConnected(self) < 0)
        return NULL;
    status = OCIPing(self->handle, self->environment->errorHandle,
            OCI_DEFAULT);
    if (Environment_CheckForError(self->environment, status,
            "Connection_Ping()") < 0)
        return NULL;
    Py_INCREF(Py_None);
    return Py_None;
}
Run Code Online (Sandbox Code Playgroud)


jbo*_*xxx 5

感谢 Ben 的回答,给出了connectionObject来自cx_Oracle图书馆的答案,这至少应该包含您可能想要的内容。

def isOpen(connectionObject):
    try:
        return connectionObject.ping() is None
    except:
        return False
Run Code Online (Sandbox Code Playgroud)