0

私は本質的にこれを行うアプリケーションを持っています:

queue = SizedQueue.new(2)
Thread.new do
  conn = OCI8.new(DSN)
  cursor = conn.exec([a query])
  cursor.fetch { |rec| queue << rec }
  queue << :queue_ended
  cursor.close
  conn.logoff
end.tap { |t| t.abort_on_exception = true }

until a = queue.pop == :queue_ended
   do_things(a)
end

問題はdo_things、エラーが発生したときに発生します。スレッドは中止されないようです。私がそれが oci8 であると信じる理由は、このコードを別の関数/ライブラリのセットで実行し、すべてがうまくいったからです。もう1つの理由は、接続が開いたままであるため、OCI8だと思います。スレッドが中止された場合、接続は閉じますか?

時折、irb で KeyBoardInterrupt を発生させ、クエリを生成するのに長い問題が発生することがあります。

スレッドを使用せずに問題を再現することはできません。デバッグがかなり難しいことは誰もが知っていることです。

NB私はRuby OCI8(rb 1.9.3の最新バージョン(2.1.5))で実行しています。

事前にご協力いただきありがとうございます

4

1 に答える 1

0

これは問題ではないか、少なくとも Ruby 2.0.0 では発生しません。理由はわかりませんが。

于 2013-07-10T10:13:59.960 に答える