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

时间:2017-03-08 10:45:49

标签: python oracle cx-oracle

我刚刚安装了一个python包:cx_oracle。从the cx_oracle document我找到了一个方法: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

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

还有其他可能的返回值吗?为什么不回归真或假?

2 个答案:

答案 0 :(得分:1)

cx_Oracle documentation states that这是:

  

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

但是,这个方法没有在PEP 249中记录 - 当前的Python数据库API规范在connection methodsoptional extensions(或其他任何地方)。

PEP 249的MySQL实现也has this method;文件说明:

  

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

     

对错误提出InterfaceError

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

  • 如果连接处于活动状态,则无法返回
  • 如果连接未激活,则会引发InterfaceError

如果我们查看the code for .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;
}

答案 1 :(得分:1)

感谢Ben的回答,给定connectionObject库中的cx_Oracle,这应该至少封装了您想要的内容。

def isOpen(connectionObject):
    try:
        return connectionObject.ping() is None
    except:
        return False