大量データを処理をしたい場合、普通に検索するとOutOfMemoryになります。
それは、基本S2Daoの検索は一気に全てのレコードをメモリ上にロードするからです。
頻度は低いとはいえ、1プロジェクトにつき、1回くらいはそれで困ることがあります。
主には、「SQLの結果からCSVファイルを出力する」というような場合です。
DBFluteではCursorHandlerを指定してCursorループでハンドリングできるようにしました。# final CursorHandler handler = new CursorHandler() {
# public Object handle(java.sql.ResultSet resultSet) throws java.sql.SQLException {
# // resultSetを好きなように扱う。
# while (resultSet.next()) {
# resultSet.getXxx...
# }
# return ...;
# }
# };
# ... = dao.selectListXxx(pmb, handler);これにて、「ResultSet直接触り」+「外だしSQL」+「Closeの必要なし」
が実現できます。しかし、java.sql.ResultSetを直接触るのはちょっと嫌です。
全然タイプセーフではないからです。そこで...#
# --#SimpleBookGenre#
# --+cursor+
#
# select book.BOOK_ID
# , book.BOOK_NAME
# , book.GENRE_CODE
# ...
#これでSql2Entityを実行すると先ほどのプログラム以下のようになります。
# final SimpleBookGenreCursorHandler handler = new SimpleBookGenreCursorHandler() {
# public Object fetchCursor(SimpleBookGenreCursor cursor) throws java.sql.SQLException {
# // cursorを経由してResultSetからタイプセーフに値を取得できる。
# while (cursor.next()) {
# BigDecimal bookId = cursor.getBookId();
# String bookName = cursor.getBookName();
# String genreCode = cursor.getGenreCode();
# ...
# }
# return null; // 別に戻り値が不要ならnullでよい。
# }
# };
# dao.selectListXxx(pmb, handler); // Daoメソッドの戻り値もvoidでよい。これにて、「ResultSet直接触り」+「タイプセーフ」+「外だしSQL」+「Closeの必要なし」
が実現できます。
これはまさしく「自動生成(DBFlute)ならでは」と言えるでしょう。これで10万件のレコードを一気に処理したいという場合でも
「JDBCを直接使う」とかやんなくてもOKです。