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 提交证书签名