DB

[DB][MyBatis][MySQL] MyBatis + MySQL에서 실제로 가능한 resultSetType

오선지♬ 2025. 10. 22. 10:46
728x90
반응형

💡 중요
MySQL JDBC 드라이버(mysql-connector-j)에서는 사실상 FORWARD_ONLY만 완전 지원됩니다.

resultSetType MySQL 실제 지원 여부
FORWARD_ONLY ✅ 정상 지원
SCROLL_INSENSITIVE ❌ 내부적으로 FORWARD_ONLY로 다운그레이드됨
SCROLL_SENSITIVE ❌ 지원 안 됨 → 결국 FORWARD_ONLY가 됨

➡ MyBatis XML에서 SCROLL_INSENSITIVE라고 써도 그대로 FORWARD_ONLY로 동작합니다.


✔ 2. 실무에서 어떤 타입을 써야 하나?

⭐ 결론: MySQL + MyBatis에서는 그냥 FORWARD_ONLY 쓰는 게 정답입니다.

  • 어차피 MySQL이 SCROLL_* 지원을 안 함
  • 가장 빠르고, 메모리 가장 적게 쓰고, 안정적
  • 데이터가 많을 때 효율적 (대부분 대량 조회 케이스)

✔ 3. 실무에서  자주 터지는 문제

MyBatis에서 대량 데이터를 조회하면 자주 나오는 에러:

java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@... is still active

이때 해결책은 아래 두 가지:

1) resultSetType="FORWARD_ONLY"

2) fetchSize 설정 (중요!)

예(xml)

 
<select id="sysIfList"
        resultType="sysIf"
        resultSetType="FORWARD_ONLY"
        fetchSize="Integer.MIN_VALUE">
    SELECT * FROM T_SYS_INTERFACE
</select>

fetchSize=Integer.MIN_VALUE는 MySQL에서 스트리밍 모드를 활성화시켜
대용량 데이터를 한 번에 메모리에 올리지 않고 바로바로 가져옵니다.


✔ 4. 성능 차이 (체감 기준)

 
resultSetType 메모리 사용량 속도 MySQL 실제 동작
FORWARD_ONLY ⭐ 최소 ⭐ 가장 빠름 YES
SCROLL_INSENSITIVE 높음 느림 NO → FORWARD_ONLY로 강등
SCROLL_SENSITIVE 매우 높음 가장 느림 NO → FORWARD_ONLY로 강등

✔ 5. 실무 추천 설정 (MyBatis + MySQL)

대량 조회 시 강력 추천:

 
<select id="getList"
        resultType="SomeDTO"
        resultSetType="FORWARD_ONLY"
        fetchSize="Integer.MIN_VALUE">
    SELECT ...
</select>
  • 스트리밍 모드로 전환
  • 메모리 폭발 방지
  • 커서 forward 이동만 가능
  • 가장 오류 없는 조합
728x90
반응형

'DB' 카테고리의 다른 글

[DB][MySQL] JSON_TABLE - GROUP_CONCAT()  (0) 2025.10.27
[DB][MySQL] JSON_TABLE()  (0) 2025.10.26
[DB][MyBatis] resultSetType 비교 그림  (0) 2025.10.21
[DB][MyBatis] resultSetType  (0) 2025.10.20
[DB][MySQL] 버전확인하기  (0) 2025.10.14