greenDAO insert 성능 향상시키는법

프로그래밍/Android 2013. 9. 13. 12:52

greenDAO insert 성능 향상시키는법


안드로이드 앱 개발시 DB에 초기데이터를 인서트 하던중... greenDAO 의 성능이 상당히 떨어지는 것을 경험했습니다.

약 3000 로우의 데이터를 insert 하는 작업이었는데...1분이상 걸렸습니다.

도저히 납득이 되지 않아 홈페이지에 있는 FAQ 를 살펴보니

3000개의 insert 작업을 각각의 트랜잭션 즉, 3000개의 트랜잭션에서 처리하는 것보다 1개의 트랜잭션에서 처리하면

500배 이상의 성능향상이 있다고 합니다.


http://greendao-orm.com/documentation/technical-faq/


그래서 3000개의 각각의 트랜잭션으로 인서트 작업을 하던 부분을 1개의 트랜잭션으로 처리하도록 바꿨습니다.


바꾸는 방법은 아래와 같습니다.


while ((line = br.readLine()) != null) 

{

infos = line.split("\t");

LottoInfo lottoInfo = new LottoInfo();

lottoInfo.setTurn( Integer.parseInt(infos[0]));

lottoInfo.setLotteryDate( DateFormatUtils.parse1(infos[1]));

lottoInfo.setWinCount1( NumberFormatUtils.parse1(infos[2]));

lottoInfo.setWinMoney1( NumberFormatUtils.parse1Long(infos[3]));

lottoInfo.setWinCount2( NumberFormatUtils.parse1(infos[4]));

lottoInfo.setWinMoney2( NumberFormatUtils.parse1(infos[5]));

lottoInfo.setWinCount3( NumberFormatUtils.parse1(infos[6]));

lottoInfo.setWinMoney3( NumberFormatUtils.parse1(infos[7]));

lottoInfo.setWinCount4( NumberFormatUtils.parse1(infos[8]));

lottoInfo.setWinMoney4( NumberFormatUtils.parse1(infos[9]));

lottoInfo.setWinCount5( NumberFormatUtils.parse1(infos[10]));

lottoInfo.setWinMoney5( NumberFormatUtils.parse1(infos[11]));

lottoInfoDao.insert(lottoInfo);

}


daoSession.runInTx( new Runnable(){

@Override

public void run() {

while ((line = br.readLine()) != null) 

{

infos = line.split("\t");

LottoInfo lottoInfo = new LottoInfo();

lottoInfo.setTurn( Integer.parseInt(infos[0]));

lottoInfo.setLotteryDate( DateFormatUtils.parse1(infos[1]));

lottoInfo.setWinCount1( NumberFormatUtils.parse1(infos[2]));

lottoInfo.setWinMoney1( NumberFormatUtils.parse1Long(infos[3]));

lottoInfo.setWinCount2( NumberFormatUtils.parse1(infos[4]));

lottoInfo.setWinMoney2( NumberFormatUtils.parse1(infos[5]));

lottoInfo.setWinCount3( NumberFormatUtils.parse1(infos[6]));

lottoInfo.setWinMoney3( NumberFormatUtils.parse1(infos[7]));

lottoInfo.setWinCount4( NumberFormatUtils.parse1(infos[8]));

lottoInfo.setWinMoney4( NumberFormatUtils.parse1(infos[9]));

lottoInfo.setWinCount5( NumberFormatUtils.parse1(infos[10]));

lottoInfo.setWinMoney5( NumberFormatUtils.parse1(infos[11]));

lottoInfoDao.insert(lottoInfo);

}

}

});


기존 쿼리를 처리하던 부분을

daoSession.runInTx( Runnable) 메소드로 감싸주시면 됩니다.


끝.

: