我在 Spring JDBC DAO 中处理大量数据。DAO 直接在对象上返回一个迭代器,该对象使用take()对有界BlockingQueue进行操作,而检索操作发生在单独的线程中(使用ExecutorService)。
在此线程中,我看到以下行为:检索有效,但对ResultSet的某些调用导致调用挂起。这些电话是
- isClosed()和
- isLast()
但不是
- isAfterLast()或
- isBeforeFirst()或
- 是第一()
显然我需要知道最后一个元素是什么(为了将一个特殊元素插入到阻塞队列中,在迭代器 hasNext() 方法中产生 false )。我可以通过在将对象放入BlockingQueue之前找出ResultSet中的行数来解决它,但这感觉有点笨拙。是否有使用 ResultSet 的线程安全方式?
切换到多线程数据源(我测试了 C3POs ComboPooledDataSource)似乎没有帮助。
注意:这个问题是我首先(错误地)在这里发现的