【问题标题】:R and RJDBC: Using dbSendUpdate results in ORA-01000: maximum open cursors exceededR 和 RJDBC:使用 dbSendUpdate 导致 ORA-01000:超出最大打开游标
【发布时间】:2014-02-06 12:57:46
【问题描述】:

在 Oracle 数据库上尝试使用 R/RJDBCdbSendUpdate 命令插入数千行时遇到错误。

可以通过创建测试表来重现问题

CREATE TABLE mytest (ID NUMBER(10) not null);

然后执行下面的R脚本

library(RJDBC)
drv<-JDBC("oracle.jdbc.OracleDriver","ojdbc-11.1.0.7.0.jar") # place your JDBC driver here
conn <- dbConnect(drv, "jdbc:oracle:thin:@MYSERVICE", "myuser", "mypasswd") # place your connection details here
for (i in 1:10000) {
  dbSendUpdate(conn,"INSERT INTO mytest VALUES (?)",i))
}

在 Internet 上搜索提供了信息,即应该关闭结果游标,这很明显(例如,参见 java.sql.SQLException: - ORA-01000: maximum open cursors exceededUnable to resolve error - java.sql.SQLException: ORA-01000: maximum open cursors exceeded)。

但是??dbSendUpdate 的帮助文件声称根本不使用结果游标:

.. dbSendUpdate 与 DBML 查询一起使用,因此不返回任何结果集。

因此,这种行为对我来说没有多大意义 :-(

有人可以帮忙吗?

非常感谢!

PS:在 RJDBC 文档http://www.rforge.net/RJDBC/中发现了一些有趣的东西

请注意,连接、结果集、驱动程序等的生命周期由相应 R 对象的生命周期决定。一旦 R 句柄超出范围(或者如果被 rm 显式删除)并在 R 中被垃圾收集,则相应的连接或结果集将关闭并释放。这对于资源有限的数据库(如 Oracle)很重要——如果可能有许多打开的对象,您可能需要手动添加 gc() 以强制进行垃圾收集。唯一的例外是即使在相应的 R 对象被释放后仍然在 JDBC 中注册的驱动程序,因为目前没有办法卸载 JDBC 驱动程序(在 RJDBC 中)。

但同样,即使在循环中插入 gc() 也会产生相同的行为。

【问题讨论】:

  • 出于好奇,为什么不使用Roracle 包。在他们的博客中,hereOracle 做了一些基准测试。
  • 感谢@agstudy 这个有趣的想法。以前不知道。会看看。

标签: r oracle rjdbc


【解决方案1】:

最后我们意识到这是 RJDBC 包中的一个错误。如果你愿意修补 RJDBC,你可以使用https://github.com/Starfox899/RJDBC 提供的修补源(只要它们没有被导入到包中)。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多