Mybatisの取得結果をcursorで受けてメモリ節約

Mybatisの取得結果をcursorで受けてメモリ節約

MyBatisで大量のデータを扱う場合、メモリ節約のためにCursorを使うことができます。
Cursorを使うことで、MyBatisは一度に全ての結果セットをメモリにロードするのではなく、ストリームのように少しずつデータを取得することができます。
以下は、MyBatisでCursorを使用するための基本的な手順です。

1. Mapperの定義

Mapperインターフェースで、戻り値の型をCursorにします。

import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.annotations.Select;

public interface YourMapper {
    @Select("SELECT * FROM your_table")
    Cursor<YourEntity> getAllRecords();
}

2. サービスまたはリポジトリでの使用

取得したCursorを使って、データを逐次処理します。
注意点として、Cursorを使用する際は明示的に閉じることが重要です。

import org.apache.ibatis.cursor.Cursor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class YourService {

    @Autowired
    private YourMapper yourMapper;

    public void processAllRecords() {
        try (Cursor<YourEntity> cursor = yourMapper.getAllRecords()) {
            for (YourEntity entity : cursor) {
                // データを逐次処理
                processEntity(entity);
            }
        } catch (Exception e) {
            // エラーハンドリング
            e.printStackTrace();
        }
    }

    private void processEntity(YourEntity entity) {
        // エンティティの処理ロジック
    }
}

3. MyBatis設定の確認

必要に応じて、MyBatisの設定を調整します。
特に、大量データを扱う場合は、適切なフェッチサイズを設定することが重要です。

mybatis-config.xmlの例:

<configuration>
    <settings>
        <!-- Fetch sizeの設定 -->
        <setting name="defaultFetchSize" value="100"/>
    </settings>
</configuration>

この設定により、MyBatisは一度に100行のデータを取得します。

まとめ

  • Cursorを使用して大量データのメモリ消費を抑える。
  • try-with-resources文を使ってCursorを明示的に閉じる。
  • フェッチサイズを適切に設定してパフォーマンスを最適化する。

これにより、大量のデータを効率的に処理できるようになります。