SpringJDBCDAOで大量のデータを処理しています。DAOは、取得操作が別のスレッドで行われている間(ExecutorServiceを使用)、 take()を使用して制限付きBlockingQueueで動作するオブジェクトに対してイテレーターを直接返します。
このスレッド内では、次の動作が見られます。取得は機能しますが、ResultSetへの特定の呼び出しにより、呼び出しがハングします。これらの呼び出しは
- isClosed()および
- isLast()
だがしかし
- isAfterLast()または
- isBeforeFirst()または
- isFirst()
明らかに、最後の要素が何であるかを知る必要があります(イテレーターのhasNext()メソッドでfalseを生成する特別な要素をブロッキングキューに挿入するため)。オブジェクトをBlockingQueueに入れる前に、 ResultSetの行数を調べることで回避できますが、これは少し不器用に感じます。ResultSetを操作するためのスレッドセーフな方法はありますか?
マルチスレッドデータソース(私はC3POのComboPooledDataSourceをテストしました)に切り替えることは役に立たないようです。
注:この問題は、私がここで最初に(誤って)特定したものです