【发布时间】: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 中称为“通道”)。