본문 바로가기

Java

ResultSet 의 동작 구조

resultset (이하 rs) 의 동작 구조를 제대로 이해하지 못하고 있는것 같아서 찾아보았다.

conn = dbconnection(conn);
stmt = conn.createStatement();
보통 이와 같이 connection 을 가져와서 아래 처럼 호출을 하게 된다.

        rs = stmt.executeQuery(sbQueryString.toString());

그리고는 rs.next() 메소드를 이용해서 데이터를 얻어서 사용을 하게 된다.

그냥 이렇게 된다는것만 인식을 하고 그냥 복사해서 사용하고 있었다.

그러다가 FetchSize 를 좀 변경해보려고 하게 되었다가 지금껏 내가 알고있던 내용이 앞뒤가 안맞는다는것을 발견 하였다.

Fetch 라는 기능은 DB에서 가져오는 데이터의 양을 조절하여, 속도를 개선시키기 위한 기능이라고 알고있어서, java에서 사용하려고 찾아보니 아래처럼 setFetchSize 만 넣어주면 간단히 적용이 되고 있었다.

        rs = stmt.executeQuery(sbQueryString.toString());
        rs.setFetchSize(100);
        rs.next()

그런데 소스를 보면, executeQuery를 하고 나서 setFetchSize를 한다는것이 나에게는 너무도 이상하고 이해가 안되는 상황이었다.

그래서 저 fetchsize 를 찾아보니, rs 의 동작 자체를 모르면서 아는것처럼 사용을 하고있던 것을 발견하였다.

execuQuery 를 하게 되면 보통 db에 다녀와서 rs 에다가 넣어둔다고 생각을 했었다.
데이터가 백만건이면 몽땅 rs에 담아둔다고 생각했었는데, 사실은 그게 아니었다.ㅋ

rs.next 메소드가 호출 되는 시점에 db에서 데이터를 가져오게 된다.

그래서 setFetchSize 가 executeQuery 다음에 설정이 되도 상관이 없었다.

결국 rs.next 호출 전까지는 그져 셋팅에 불과했었고, rs.next 가 호출 되야 db에서 fetch size 만큼 가져오게 된다. (fetch의 기본값은 10)

이것에 대한 확신은 아래 사이트의 글에서 갖게 되었다.


그리고, setFetchSize는 rs와 statement 에도 동일한 메소드가 들어있으며, 어디에 설정을 해도 상관은 없을것 같다.


'Java' 카테고리의 다른 글

(펌) java 로 tail 구현  (0) 2013.04.10
java exec 공백 파일 실행  (0) 2012.10.29
디렉토리 존재 여부와 생성  (0) 2011.06.15
[펌] ResourceBundle  (0) 2011.05.30
(펌)jad  (0) 2011.03.28