RODBC 连接无效

Posted

技术标签:

【中文标题】RODBC 连接无效【英文标题】:RODBC Connection becomes invalid 【发布时间】:2015-07-20 16:15:14 【问题描述】:

我正在使用提供的 ODBC 驱动程序和 RODBC 包测试一个新的数据库系统。

我遇到的问题是,经过几次查询(都在 2~3 分钟或更短的时间内),连接不再被 R 识别为有效。

具体来说,它只是 RODBC 包中的一个 C 函数,RODBCcheckchannel 正在抱怨。被sqlQuery()间接调用


第一行RODBC::sqlQuery调用

if (!odbcValidChannel(channel))
    stop("first argument is not an open RODBC channel")

odbcValidChannel 检查channel的三个属性。 我可以确认在R 中完成的两项检查返回TRUE。 这是最后一次检查,.Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) 返回FALSE

RODBCcheckchannel的源码如下

SEXP RODBCcheckchannel(SEXP chan, SEXP id)

    SEXP ptr = getAttrib(chan, install("handle_ptr"));
    pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr);

    return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP &&
       thisHandle->channel == asInteger(chan) &&
       thisHandle->id == asInteger(id));

我曾尝试使用R -d valgrind,但由于C 代码没有崩溃per-se,这没有帮助。

有人能解释一下为什么.Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) 在短时间内返回TRUE 然后返回FALSE 跟手柄有关系吗?

(对于缺乏可重复的示例表示歉意,因为这需要访问非常特定的数据库系统)

【问题讨论】:

猜测:数据库可能正在关闭连接? 只是——这里没有足够的信息。 ODBC 有一个跟踪/记录工具——您应该启用它,尝试重新创建错误,然后看看您发现了什么。缺乏这些... 至少,解决此类问题通常需要了解相关 DBMS 和驱动程序的名称和版本,有时需要了解双方的主机操作系统,以及各种其他详细信息......我们这里没有. 我唯一能提供的是,我经历过远程数据库在一段时间后关闭连接,但我已经看到(使用 Oracle)使用 RODBC 和 ROracle,而且它始终是远程数据库这样做。 ODBC 连接有一个默认的连接超时值,它取决于驱动程序和数据库,例如。 G。 30、60 或 120 秒。如果您在此秒数内不使用连接,则连接将自动关闭(“连接”在 RODBC 中称为“通道”)。 【参考方案1】:

您可以在以下代码中添加跟踪吗?如果是这样,打印出 thisHandle、TYPEOF(ptr)、thisHandle->channel、thisHandle->id 的值以查看发生了什么变化会很有用?

SEXP RODBCcheckchannel(SEXP chan, SEXP id)

    SEXP ptr = getAttrib(chan, install("handle_ptr"));
    pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr);

    return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP &&
       thisHandle->channel == asInteger(chan) &&thisHandle->id == asInteger(id)); 

【讨论】:

以上是关于RODBC 连接无效的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接成功,但是对象名无效怎么回事

iTunes 连接错误:您上传的二进制文件无效。签名无效,或未使用 Apple 提交证书签名

Grapevine 远程连接错误请求 - 主机名无效

Mysql:无法连接:无效的设置。配置中定义的 controluser 连接失败

猫鼬无效连接[重复]

iTunes连接中的无效二进制文件