[알림] 삭제된 동영상 및 이미지나 깨진 링크, 저작권에 문제가 될 소지가 있는 내용은 이곳에 알려주시면 바로 조치하도록 하겠습니다. 감사합니다. - Fortune Cookie
첫번째, 풀링연결의 최소, 최대치에 대해 제우스 상에서의 풀링 정책에 대해 알고싶습니다.

연결개수의 최대치와 최소치를 정해두고 사용할때에 여러 연결이 있을시 자동으로 최대치까지는 연결을 늘리는것으로 아는데 로그를 일정시간동안 살펴본결과 연결이 최소치만큼 자동생성되고 최소치에 근접하거나 최소치가 됐을때 풀을 REFRESH하더 군요 그리고 최소치가 넘어갔을때는 에러를발생시키고요. 답변 부탁드립니다.

일단 관련 메뉴얼을 먼저 참조해 주시면 자세한 정보를 얻을수 있으십니다.
JEUS에서 제공하는 db connection 방법은 j2ee기반의 datasource 와 j2se 기반의 db connection pool 이 있습니다. 질문 포인트가 db connection pooling인듯 하여
db connection pool에 관점을 두고 설명드릴게요.

엔진 부팅시에 [db-pool-control]의 [min] 설정갯수만큼 연결을 맺습니다.
서비스 시에는, 필요에 따라 [max] 설정갯수만큼 [step] 설정치 단위로 추가연결을 맺습니다. [min] 갯수 이상으로 생성된 connection들에 대해서는, 에 설정된 시간을 기준으로
설정시간 이상 아무일을 하고있지 않으면, pool에서 삭제하여, 자원사용의 효율을 위해
항상 [min]값을 유지하려 노력합니다. 이런 pool상태들의 엔진차원의 check 주기는 [check-db-connection-pool] 에 설정된 시간을 기준으로 rotation 합니다.

두번째, 풀링연결시에 REFRESH시간에 대해 질문입니다.

저의 경우에 최소치에 근접하는 경우 REFRESH가되었는데 , 설정으로 REFRESH시간을 정할 수 있나요? 제가 문서를 잘 안봐서 이런질문을 하느것같지만 그래도 답변 부탁드립니다.

첫번째 질문에 대한 답변에도 나와있듯이, WEBMain.xml 의, [web-container][monitoring][check-db-connection-pool]에 설정된 주기 간격으로 [min]갯수 이상 생성된 connection들에 대한 check( connection이 idle인지.. blocking 인지..등)가 이루어 지고, check결과 어떤 connection이 [max-idle-time] 만큼 아무런 일도 하지 않는다라고 판단되면 해당 connection을 강제적으로 끊습니다.
* 부가기능 *
[max-alive-time] :  [db-pool-control]의 sub 태그이며, connection이 생성된 후(pool에..) 설정시간 이상 사용되었다면(바꿔말해, 그 connection이 생성된 후, 사용됬는 안됐든 경과된 시간이..) 해당 커넥션을 강제종료시키고, 새로운 커넥션을 만들어 다시 pool에 채워 넣습니다.
[max-use-count]  :  어느 connection의 최대 사용빈도를 지정해 줍니다. 예를들어 해당 값이 10이라면, 하나의 커넥션은 10회 재사용 될 것이며, 10번 사용이 끝나면, 강제종료로 소멸되고 새로운 connection으로 대체가 됩니다.

세번째, 풀링시에 Statement 와 PreparedStatement 문의 경우 언제 close해야하나요?

연결클래스를 따로 두어 래핑하여 사용하고있습니다. 해당 클래스에서 연결을 close시에 Connection,  Statement, PreparedStatement,  CallableStatement, ResultSet 등을 일괄적으로 close시키고 명시적으로  해당 연결에서 사용된 모든 변수들을 null로 만들어버립니다. 그리고 해당 래핑 클래스를 사용한 빈에서  래핑 클래스의 close메소드를 호출후에 래핑클래스를 null로 만듭니다. 하나의 쿼리문일경우 상관없지만  여러개의 쿼리를 반복적으로 사용하거나 계속 다른 쿼리를 사용할시에 언제쯤 close해야할까요. 새로운  쿼리가 들어올시마다 close해야하나요? 같은 쿼리라도 해당 데이터베이스 커서의 문제때문에 닫아야  한다은것은 알고있습만 close시기가 제우스의 같은경우 사용하다보면 명확하지 않다라는 느낌을 많이
받아서 질문드리는 겁니다.


java에서 dbpool은 기본적으로 connection에 대하여 setAutoCommit(true)입니다.
즉, 하나로 묶인 transaction block이 끝날때 commit이 이뤄진다는 것입니다. 일단, java.sql.* 혹은 javax.sql.*의 하위자원들은, 생성된 수 만큼 반납이 확실히 이뤄져야 합니다.
예를들어, 하나의 connection, 하나의 statement, 하나의 resultset 이 오픈되었다면, 각각 생성된 역순으로 명시적인 반납절차가 반드시 필요합니다. 질문하신데로, 하나의 transaction block 내에서, statement가 여러번 생성/사용되었다면 이는 connection이 종료되는 시점에 다시금 오픈된 수만큼 반납되어야 하겠습니다. (여기서 오픈된 수라함은, 생성된 reference 변수를 의미합니다.)

아래의 예를 참조하세요.
(예 1)
try{
  ...
Statement st1 = new Statement();
st1.executeQuery("select ...........");
Statement st2 = new Statement();
st2.executeQuery("select ...........");
  ...
st1.close();
st2.close();    
}catch(Exception e){
do something;
}finally{
  ...
  if(st1 != null){
      try{
st1.close();
      }catch(Exception e){
          do something;
      }
  }
  if(st2 != ull){
      try{
st2.close();
      }catch(Exception e){
          do something;
      }
  }
  ...
}

(예 2)
try{
  ...
Statement st1 = new Statement();
st1.executeQuery("select ...........");
st1 = new Statement();
st1.executeQuery("select ...........");
  ...
st1.close();   
}catch(Exception e){
do something;
}finally{
  ...
  if(st1 != null){
      try{
st1.close();
      }catch(Exception e){
          do something;
      }
  }
  ...
}

※윗 예제는 심플한 구조로, 객체 reference에 대한 null체크여부 & Exception 처리가 누락되었습니다.


네번째, 풀에서 Connection을 가져와 사용시에 비정상적인 Connection 혹은 REFRESH전에 Connection에 대한 풀링 정책이 궁금합니다.

타임아웃이 되면 자동적으로 풀링에 반환이 될텐데 이경우 외에 타임아웃전이나 풀이 REFRESH되기전에 비정상적인 Connection으로 풀이 꽉 채워졌다면 혹은 반환은 됐지만 REFRESH가 되지않았을 때 다른 빈에서 Connection을 가져와 사용할 수 는 없나요?

일단, connection pool에 생성된 connection들이 모두 사용중일경우, 추가 요청이 들어오게 되면 [dynamic-increment] 설정이 true로 되어 있다면, 추가적인 connection을 생성하여 넘겨주고, false 일 경우는, [get-connectiontimeout]에 설정된 시간만큼 지켜본 후, 가용한 커넥션이 없으면 요청한 client에게 null을 리턴해 줍니다. 말씀하신 비정상적인 connection이, client에서 얻어간 후, 루핑이나 기타 환경적인 요소에 의해 비정상 상태로 빠진 connection을 의미하신다면, 아래와 같은 작동을 예상할 수 있습니다. [close-long-active-connection이 true로 설정되어 있다면, 엔진에서는 [max-active-time] 에 설정된 값을 기준으로,  connection 회수 혹은 강제종료 여부를 결정하게 되고, 강제종료가 필요하다면, [dba-connection]에 설정된, dba권한의 connection을 얻은 후, 해당 connection을 db 레벨에서 강제종료 시키게 됩니다. (alter session kill... 등) DBA 커넥션은 DB 커넥션 풀이 연결을 맺는 db에 대해 admin권한을 가지고 있고, 필요시 이에 접근하여 커넥션에 대한 여러 문제들을 해결하는데 사용됩니다.

출처: http://www.javaservice.net/~java/bbs/re ··· %3Bs%3Dt
2006/10/25 01:53 2006/10/25 01:53
관련글타래
    이글의 태그와 관련된 글이 없습니다.
    받은 트랙백이 없고, 댓글이 없습니다. 1937번 조회되었습니다.

    트랙백 주소 :: http://www.bywoong.com/trackback/1123

    댓글을 달아 주세요

    [로그인][오픈아이디란?]

    구독안내 주 2~3회 새글이 올라옵니다. 블로그 방문없이 업데이트 되는 글을 구독하세요. RSS . E-Mail . HanRSS . WZD . Google Reader . Bloglines . Delicious Bookmark this on Delicious