rabat
57
2015-07-29 14:29:26
4
8441

java jdbc로 10만건이상 쿼리


jdbc로 쿼리(오라클)를 10만건이상 결과의 쿼리를 

그냥 돌려도 중간에 커넥션이 끊긴다던가..등의

다른 문제가 없나요?


아니면 대용량 결과를 조작하기 위해서 

별도의 다른 방법이 있는건지 문의드립니다.


0
1
  • 답변 4

  • ilovecw00
    564
    2015-07-29 14:42:33

    10만건을 리스트로 화면에 뿌린다면 좀 느리겠지만

     

    조회해오는 과정자체에는 크게 문제가 없을것 같은데요...  커넥션이 끊기거나 하지는 않습니다.

     

    쿼리자체가 느리지다면 timeout 설정해놓은경우 끊길수 있겠죠  

     

    문제가 있다면 정확이 어떤부분이 문제가 되는지 올려주세용!  

    0
  • zepinos
    19k
    2015-07-29 15:51:06

    일반적으로 네트워크 상황이 좋지 않아 강제로 끊김을 당하지(요즘 유행어처럼 자살 당하다...비슷한) 않는 이상 값을 조회하다가 끊기는 경우는 없습니다. 다만, 웹의 경우 클라이언트나 서버 양쪽에서 하나의 요청에 대해서 몇 초 동안 처리를 못할 경우 끊을 수 있는 옵션이 기본적으로 주어진 경우가 대부분입니다.


    그리고, MyBatis 와 같은 형태에서 쿼리를 실행하고 바로 List 나 Map 등으로 매핑해서 저장하는 경우가 있는데, 이 경우는 문제가 될 수 있습니다. 이 때에는 MyBatis 설정 하나로 DB 연결정보를 관리하고자 하는 경우가 많기 때문에 MyBatis 에서 Connection 개체를 얻어와서 직접 Statement/PreparedStatement 로 쿼리를 넣어서 ResultSet(=rs) 을 받아 JSP 까지 rs 개체를 넘겨서 거기서 바로 출력하는 고전적인 방법을 쓰는게 낫습니다(성능). rs 는 DB 의 커서를 가리키는 존재이다...라는 걸 이해하면 왜 이렇게 처리하는지 아실 수 있는데, 사실 화면 상에 10만건 이상을 가져와서 출력하는 경우는 극히 드물기 때문에 대부분 잘 모르고 넘어가는 것도 사실입니다.
    0
  • rabat
    57
    2015-07-29 17:37:07

    네 답변 감사합니다. 말씀하시는 것처럼 화면에 10만건을 뿌리는건 아니구요.

    배치 프로그램인데,, 결과건수가 저렇게 많은 건을 처리해보지 않아서,

    일단 웹에서 사용자 화면에 보여지는게 아니라면, JDBC로 10만건정도 쿼리해서

    처리하는건 문제가 없는것 같네요. ^^

    하나 더 질문 드리면 ResultSet 을 가져올때  setFetchSize() 라고 가져올 한 번에

    fetch할 사이즈를 지정해주는게 있는데 검색해보니 이게 디폴트가 10이라고 하는데,

    메모리 공간이 충분하다면, 이 사이즈를 좀 늘려주는게, 전체적인 처리속도가 

    빨리 지는거 맞나요? 아무래도 실제 데이터를 fetch하기 위해 db에 접속하는게

    부하가 생기기 때문에 그럴것 같은데.. 


    0
  • zepinos
    19k
    2015-07-29 17:58:39
    일단 Object 에 10 만개의 데이터를 담는 순간 메모리는 크게 잡아먹고 속도는 크게 떨어집니다. 그래서 rs 로 처리하는게 좋다는 것이고, fetch size 보다는 rs.next() 로 한 개씩 넘어가면서 작업하시면 됩니다. 속도 상 단방향 진행을 하는 기본 rs 가 가장 빠릅니다. 이건 화면에 뿌려주는 문제 뿐만 아니라 batch 처리를 할 때에도 동일합니다. 그리고 10 건을 굳이 java 에서 처리해야 하나 싶은 데이터라면(즉, DB 에서 가공이 가능한 정보라면) 프로시저 등으로 처리하는걸 권합니다.
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.