我有一个基本上可以做到这一点的应用程序:
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 的原因是因为我们让这段代码使用一组不同的函数/库运行,一切都很好。我认为它是 OCI8 的另一个原因是因为连接仍然打开,如果线程中止,连接肯定会关闭吗?
我偶尔会在 irb 中引发 KeyBoardInterrupt 并生成查询时遇到问题。
抱歉,如果这不是很多事情要做,我没有太多事情要做 - 如果不使用线程,我无法重新创建问题,而且我们都知道调试相当困难。
注意我正在使用 ruby OCI8(rb 1.9.3 上的最新版本(2.1.5))运行。
提前感谢您的帮助