RODBC连接变得无效
问题描述:
我使用的是提供的ODBC驱动程序和RODBC
封装测试一个新的数据库系统。RODBC连接变得无效
我遇到的问题是,只有少数查询(所有的2〜3分钟或更短的时间跨度内)后,连接不再由R.识别为有效
具体而言,仅在RODBC
包,其中RODBCcheckchannel
抱怨单个C
功能。它是由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
代码不会崩溃每本身,这没有帮助。
有人可以说一些为什么.Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))
返回TRUE
一会儿然后返回FALSE
?
它与手柄有关吗?
(道歉缺乏可重复性exmample的,因为这将需要访问一个非常具体的数据库系统)
答
你可以添加跟踪到下面的代码?如果是这样,那么打印出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));
}
猜测:也许数据库正在关闭连接? –
只是 - 这里没有足够的信息。 ODBC具有跟踪/日志记录功能 - 您应该启用此功能,尝试重新创建错误并查看所发现的内容。缺乏这一点...最起码,解决诸如此类的问题通常需要知道有问题的DBMS和驱动程序的名称和版本,有时候双方的主机操作系统以及其他各种细节......我们在这里没有。 – TallTed
我可以提供的唯一的事情是,我经历了一段时间后关闭连接的远程数据库,但是我已经看到(使用Oracle)使用RODBC和ROracle,并且它始终是远程数据库执行此操作。 – joran