MyBatis ResultHandler 와 Fetch Size 조정을 통한 대용량 Excel File Dwonload
- Java 8
- MyBatis + Mysql
- Spring boot + Gradle
- Apache POI
public abstract void handleResult (ResultContext<? extends T> resultContext)
@Override
public void setBody() {
// ResultHandler를 생성, write 메소드를 사용할 수 있도록 넘겨준다.
ResultHandler<Map<String,Object>> resultHandler = this::write;
downMapper.get(resultHandler);
}
@Override
protected void write(ResultContext<?> resultContext) {
Map<String,Object> map = (Map<String,Object>) resultContext.getResultObject();
rowNum++;
SXSSFRow row = createRow(1); // 신규 Row 생성.
createCell(row, 1, String.valueOf(rowNum)); // No 작성.
AtomicInteger cellNo = new AtomicInteger(1);
map.forEach((k,v)-> createCell(row, cellNo.getAndIncrement(), k +"_"+ v)); // Cell+1 씩하면서 Map에 들은 Data작성
// ROW가 6만건 이상 일시, 신규시트를 생성하여, 신규시트에 작성
if (getRows() > MAX_EXCEL_ROW_SIZE) {
createSheet(); // 신규 시트 생성
}
}
@Mapper
public interface DownMapper {
void get(ResultHandler<Map<String, Object>> resultHandler); // void로 선언
}
https://mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/session/ResultHandler.html
<select id="get" resultType="Map" fetchSize="1000">
SELECT NAME, ID, DEPT
FROM USER
</select>
VO 등으로 resultMap을 구현할 경우 Data Mapping시 속도가 느려진다.
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3376/NAME?useCursorFetch=true
약, 15개의 컬럼과 30만건의 Row 테스트시 무리없이 생성되었으나, Excel 용량이 너무 많아져 Excel이 오픈하는게 느리다.. 10만건정도가 최선인듯