私は本質的にこれを行うアプリケーションを持っています:
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))で実行しています。
事前にご協力いただきありがとうございます