greenDAO insert 성능 향상시키는법
프로그래밍/Android 2013. 9. 13. 12:52greenDAO 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) 메소드로 감싸주시면 됩니다.
끝.
'프로그래밍 > Android' 카테고리의 다른 글
android ListView Adapter의 getView 메소드에 대한 이해 (0) | 2013.09.24 |
---|---|
greenDAO 두 Entity 간에 관계 설정하기 (0) | 2013.09.24 |
안드로이드 SqlLite Database ORM 프레임웤 greenDAO (0) | 2013.09.10 |
안드로이드 로그 프레임웤 logback (0) | 2013.09.10 |
Spring For Android, Rest Client 를 사용한 서버와의 통신 (0) | 2013.09.04 |