1

Oracle データベースでR/RJDBCとコマンドを使用して数千行を挿入しようとすると、エラーが発生しました。dbSendUpdate

テストテーブルを作成することで問題を再現できます

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))
}

インターネットを検索すると、結果カーソルを閉じる必要があるという情報が得られました。 : 開いているカーソルの最大数を超えました)。

しかし??dbSendUpdate、結果カーソルをまったく使用しないという主張のヘルプ ファイル:

.. dbSendUpdate は DBML クエリで使用されるため、結果セットは返されません。

したがって、この動作は私にはあまり意味がありません:-(

誰でも助けることができますか?

どうもありがとう!

PS: RJDBC のドキュメントhttp://www.rforge.net/RJDBC/で興味深いものを見つけました。

接続、結果セット、ドライバーなどの有効期間は、対応する R オブジェクトの有効期間によって決定されることに注意してください。R ハンドルがスコープ外になり (または rm によって明示的に削除された場合)、R でガベージ コレクションされると、対応する接続​​または結果セットが閉じられて解放されます。これは、リソースが限られているデータベース (Oracle など) にとって重要です。開いているオブジェクトが多数ある可能性がある場合は、手動で gc() を追加してガベージ コレクションを強制する必要がある場合があります。唯一の例外は、対応する R オブジェクトが解放された後でも JDBC に登録されたままになるドライバーです。現在、JDBC ドライバーを (RJDBC で) アンロードする方法がないためです。

しかしgc()、繰り返しになりますが、ループ内に挿入しても同じ動作が生成されます。

4

1 に答える 1

1

最後に、これがパッケージ RJDBCのバグであることに気付きました。RJDBC にパッチを適用する場合は、https://github.com/Starfox899/RJDBCで入手できるパッチ適用済みソースを使用できます(パッケージにインポートされていない場合に限ります)。

于 2014-02-06T18:10:32.337 に答える