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 的原因是因为我们让这段代码使用一组不同的函数/库运行,一切都很好。我认为它是 OCI8 的另一个原因是因为连接仍然打开,如果线程中止,连接肯定会关闭吗?

我偶尔会在 irb 中引发 KeyBoardInterrupt 并生成查询时遇到问题。

抱歉,如果这不是很多事情要做,我没有太多事情要做 - 如果不使用线程,我无法重新创建问题,而且我们都知道调试相当困难。

注意我正在使用 ruby​​ OCI8(rb 1.9.3 上的最新版本(2.1.5))运行。

提前感谢您的帮助

4

1 回答 1

0

事实证明这不是问题,或者至少在 Ruby 2.0.0 中不会发生;我不知道为什么。

于 2013-07-10T10:13:59.960 回答