알아야할 사실들
- 안드로이드는 클라이언트이므로 DB커넥션자원이 몇개면 충분하다.
- 안드로이드에서 DB 커넥션할 때 기본은 AsyncTask, Thread생성이다.
왜냐? 자원이 딸리므로 DB가져오는데 시간이 걸리는데 DB가져오는걸 Main Thread(UI Thread)에서 진행하 면 화면이 먹통이 되니까.
- 안드로이드에서는 JSP 서버할때처럼 커넥션풀에 백개씩 담아놓고 돌려쓰고 그러지 못한다.
문제
- 이번 상황은 DB에서 그리드의 데이터를 가져오는 함수(쓰레드가 들어있다.)안에 static으로 선언된 DB커넥션 자원이 들어있어서 발생했다.
이번에 본 코드의 문제는 쓰레드안에서 스태틱 변수(DB커넥션자원)를 썼기 때문.
문제가 생긴 코드는 리스트뷰에서 선택된 아이템들(멀티 셀렉트 모드이다.)을 하나하나 for 문 돌리며 제약조건을 통과하면 DB에 넣는 메서드(쓰레드포함)를 호출하는 부분.
BooleanSparseArray selectedItems = listView.getCheckedItems();
List<int> indexs = new List<>(); //리스트뷰의 SelectedItems Index목록
for(int i = 0 ; i < selectedItems.size(); i++)
{
indexs.add(selectedItems.keyAt(i));
}
for(int i = 0 ; i < indexs.size() ; i++)
{
Item item = listView.getItem(indexs.get(i));
//제약 조건(생략)
ProcessDB(item); // DB처리 함수 (쓰레드 포함)
}
ProcessDB안에서 static으로 선언된 쿼리 생성, 실행, 결과에 사용되는 자원을 사용하고 있다.
선택된 아이템이 세개라고 하면 동시에 세 쓰레드가 같은 자원을 접근하여 이리저리 꼬이게 되는 문제 발생.
이럴때는
선택된 아이템개수만큼 DBConnection을 만드는건 말이안되고
그냥 반복문 통째로 DB처리함수(ProcessDB) 안으로 집어넣는게 상책이다.
쓰레드 호출하고 UI에 결과 적용할때는 handler 사용하는거 잊어버리면 안된다.
'프로젝트 > Android' 카테고리의 다른 글
ListView에 클릭리스너 달기 (0) | 2018.09.24 |
---|---|
ListView의 Choice Mode (0) | 2018.09.24 |
자원재활용 contentView (0) | 2018.09.08 |
Android에서 SpreadGrid UI 만들기 (0) | 2018.09.08 |
댓글