2014년 5월 26일 월요일

Bitmechanic JDBC Connection Pool[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육] By 안기현, SCJP, msrichard25@hotmail.com, 인터넷에 여러가지 커넥션풀이 있지만 그 중에서도 제가 현재 적용해 쓰고 있는 Smart한 커넥풀을 소개할까합니다. JDBC 리소스에 관한 고찰 먼저 JDBC의 리소스, 즉 ResultSet, Statement, Connection에 대해 짚고 넘어갈 필요가 있습니다. 자바서비스넷 추천문서 코너의 [서블렛 + JDBC 연동시 코딩 고려사항 by 이원영]를 보면 가장 바람직한 JDBC 코딩 예제가 명확한 설명과 함께 올라와 있습니다. Try-Catch문과 Finally를 이용해 어떤 상황에서도 정확하게 자원을 해제(close)할 수 있게끔 해놓았습니다. 왜 이렇게 확실하게 리소스를 해제해야 하는가? 그 대답은 JDBC 리소스들이 가비지콜렉터(GarbageCollector : 이하 GC) 대상이 아니기 때문입니다. (이 부분은 이원영씨의 문서에도 언급이 되어있는데 설명이… -_-.) 이 부분에 대한 설명은 썬의 자바포럼에 정확히 기재가 되어있어 언급을 할까 합니다. 썬 자바포럼 (http://forum.java.sun.com/thread.jsp?forum=48&thread=88874) The java garbage collection idiom was NOT developed with the intent of collecting 'resources.' It exists solely to collect memory, nothing else. This is not all that extreme when one considers that most if not all of the the computer theory on garbage collection is based on collecting memory only. Java does that very well. In this case other resources are in use here. Java does not deal well with implicit handling of other types of resources. One should always explicitly deal with other resources, like explicitly calling the close() method on Connection, Statementand ResultSet(). -_-;; 뭔말이냐면 자바 가비지 컬렉터는 “자원”을 모으기 위해서가 아니라 “메모리”를 모으기 위한 의도로 개발되었을 뿐이라는 겁니다. 그러므로 묵시적, 암시적인 자원 핸들링이 이루어지지 않음으로 항상 명시적으로 자원을 관리를 해줘야하고 정확히 close()를 호출해 주어야 합니다. ResultSet, Statement, Connection는 되도록 멤버변수로 쓰지 마시고 로컬변수로 써주시고 한번 사용한 ResultSet, Statement, Connection 변수에 레퍼런스값(자바는 call by value이므로)을 재할당하지 않는 편이 좋습니다. 자세한 설명은 이원영씨의 추천문서에 나와있으니 꼭 읽어 보시길 바랍니다. Bitmechanic 커넥션풀의 동작 Bitmechanic 홈페이지의 ConnectionPool에 대한 FAQ와 예제를 참고해 정리했습니다. 먼저 프로퍼티를 보시는 편이 이해가 빠를 듯 합니다. poolAlias=thinPool jdbcDriver=oracle.jdbc.driver.OracleDriver dbURL=jdbc:oracle:thin:@107.0.0.1:1521:orcl dbUser=scott dbPassword=tiger reapConnInterval=300 maxConn=20 idleTimeout=60 checkoutTimeout=60 maxCheckout=15 특이한 프로퍼티로 poolAlias와 reapConnInterval, idleTimeout, checkoutTimeout, maxCheckout 이 보입니다. poolAias는 JDBC 풀을 별명(Alias)를 줘서 여러 개의 풀을 이용할 수 있게 해줍니다. (저의 경우는 프로토콜 위반에러 때문에 thin방식과 oci방식 두가지의 풀을 이용합니다.) reapConnInterval은 다른 커넥션 풀들과는 틀린 부분이고 bitmechanic 커넥션풀의 가장 중요한 옵션입니다. reapConnInterval을 두가지 경우에 커넥션 풀의 connVector에서 커넥션을 제거하게 됩니다. [reaping : 베어들이다, 거둬들이다] 1. 풀에서 conn이 나갔는데(checkout) checkoutTimeout 시간안에 돌아오지 않을 경우 2. 풀의 connVector에서 전혀사용되지 않는 상태(idle)로 idleTimeout 시간을 초과할 경우 bitmechanic 커넥션 풀은 (이하 BCP) 최대 Connection 수를 설정해도 무조건 20개면 20개 커넥션이 담겨져 있는 것이 아니라 필요에 따라 수를 채워가고 또 전혀 사용이 되지 않으면(Idle) 수를 줄입니다. 즉, maxConn이 20이어도 사용특성에 따라 5개만이 풀에서 운용될 수도 있다는 얘깁니다. 그걸 가능하게 해주는 프로퍼티가 reapConnInterval 입니다. ## 참고 유저의 Connection 반환문제, JDBC 코딩에 있어서 Reference 문제, Container 문제 등 여러 복합적 상황에서 떠돌아 다닐 수 있는 Connection 등을 일정시간을 두어 제거해주므로 매우 유용합니다. BCP를 적용하기 전에는 계속 톰캣을 restart 해줘야 했는데 적용 후에는 전혀 톰캣을 restart 할 일이 없어졌습니다 checkoutTimeout은 너무 짧게 설정해도 안되는게 정상적인 query 수행시간이 길다면 정상적으로 작동하는 query 수행 중에 Connection을 Reaping 해버리게 되므로 최대 쿼리 수행 시간보다는 크게 해둬야 합니다. idleTimeout은 Thread 그 자체인 ConnectionPoolManager가 그 간격으로 수행을 하게 되므로 적당한 시간을 설정하면 될 듯 합니다. (데이터베이스의 불필요한 Open Session 수를 줄일 수 있슴) maxCheckout은 풀에서 재사용되는 Connection이 일정 횟수를 넘으면 자원 해제(close)를 해버린다는 겁니다. Cursor Leak을 방지하기 위해서인데 두가지 경우에 생깁니다. 1. 유저가 ResultSet, Statement close()를 잊었거나 finally로 하지 않았을 경우 2. 벤더의 JDBC Driver의 Bug인 경우 (오라클의 8.0.5, 8.1.5 버전 JDBC 드라이버) 개인적으로 이 옵션에 대해 상당히 만족합니다. 유저의 실수와 벤더의 버그 모든 경우를 커버해주니까요. reapConnInterval도 마찬가지 입니다. Bitmechanic 커넥션풀 구조 일단 주요 BCP의 클래스를 설명하자면 다음과 같습니다. ConnectionPoolManager 커넥션 풀을 관리 implements Driver, Runnable 1 ConnectionPool 실제 커넥션 관리 (connVec, closeVec) N PooledConnection JDBC Conneciton의 Wrap 클래스 N * M 실제 위에서 본 프로퍼티값은 ConnectionPoolManager를 통해 ConnectionPool에 저장이 되고 그 값을 가지고 실제 작업을 수행하는 것은 ConnectionPool 입니다. 물론 ConnectionPoolManager가 호출을 하는 형식입니다. 여기서 유심히 보아야 할 부분이 ConnectionPoolManager 입니다. 각각 Driver와 Runnable을 implements를 했습니다. Runnalbe은 Reaping을 주기적으로 수행하기 위해서라는 것이라 쉽게 생각되어지지만 왜 JDK의 Driver를 implements를 했느냐, Driver 클래스라면 생소할지 모르겠지만 아래 코드를 보면 생각이 날겁니다. Class.forName(oracle.jdbc.driver.OracleDriver).newInstance() JDK의 소스를 열어보면 Driver 오브젝트의 형태로 VM의 DriverManager에 등록되어 관리가 됩니다. 저장구조는 Vector 입니다. ConnectionPoolManager가 Driver를 implements되어 VM에 등록이 되기 때문에 더욱 안정적인 Connection 자원 해제가 가능해지게 됩니다. 많은 종류의 커넥션풀은 일반 클래스들로 Container 클래스 로더에 의해 로딩되어 관리가 됩니다. 하지만 나름대로 버그가 있을 수도 있는 Container에 등록이 되게 되므로 안정적이고 신뢰성 있는 관리를 제공한다고 단언할 수 없는 것도 사실입니다. ## 참고 톰캣을 restart하면 모든 자원이 해제될 것이라고 생각되지만 톰캣 클래스 Loader도 VM 가비지콜렉터도 “메모리” 관리에 초점을 맞추었지 “자원” 해제를 해주지 않을 거라 생각이 됩니다. (이 부분은 더 조사를..-_-;;) 즉, Reference 오브젝트만이 Unload되어 떠도는 Connection들이 축적될 수 있습니다. 그러다 결국 많은 DB의 오픈 Conneciton Process들을 발견하고 DB를 restart 시켜야하는 상황까지 가게 됩니다. (경험담입니다.) 즉, 자바 클래스의 위치에서 본다면 OS 라고 할 수 있는 VM에 Driver로 등록된다는 것은 매우 큰 메리트를 준다고 할 수 있습니다. 사용법 드디어 사용법이오. 서론이 길어 죄송했소. 헛~! (-_)y~ 죄송하오. 순서대로 보도록 하겠습니다. 커넥션 풀 매니저 등록 Class.forName(dbDriver); //300, pool.reapIdleConnection() thread' method interval cpm = new ConnectionPoolManager(reapConnInterval); /* * 20, // max connections to open * 60, // seconds a connection can be idle before it is closed * 60, // seconds a connection can be checked out by a thread * // before it is returned back to the pool * 15, // number of times a connection can be re-used before // connection to database is closed and re-opened // (optional parameter) */ cpm.addAlias(alias, dbDriver, dbUrl, dbUser, dbPass, maxConn, idleTimeout, checkoutTimeout, maxCheckout); 처음엔 다를거 없습니다. JDBC드라이버 등록해 주시고 커넥션 풀 메니저 생성해주고 alias를 준다음 등록시키면 내부적으로 ConnectionPoolManager가 DriverManager에 등록이 됩니다. 커넥션 얻어오기 Conn = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX + alias); 언뜻보면 풀에서 가져오는 것 같지 않아 보이지만 Drvier 클래스를 implement했기 때문에 내부적으로 ConnectionPool에서 리턴이 됩니다. 커넥션 반환하기 if(conn != null) { try { conn.close(); }catch(SQLException sqle) { log.writeLog(sqle); } } “이 사람 거짓말 한다” 라고 생각될지도 모르겠습니다만 아닙니다. -_-;; BCP은 Connection을 Wrap한 PooledConnection을 쓰고 있습니다. 다형성(Polymorphism)을 이용했으므로 close()를 호출하면 내부적으로 freeConnection(conn)이 호출됩니다. 현재 풀 상태 보기 ConnectionPool cp = cpm.getPool("thinPool"); return cp.dumpInfo(); 현재 몇 개의 커넥션이 풀에 올라와 있는지 언제 최종 Access되어있는지 등 많은 정보를 트리구조로 볼 수 있습니다. 좀 신경써주면 좋은 모니터링 페이지를 만들 수 있을 것 같습니다. 마무리 문서 두번째 써보는데 양이 많아 시간이 많이 걸렸습니다. 대충 쓴 부분도 많아 꼭 지적을 해주시면 감사하겠습니다. 문서에 2가지 정도가 빠졌습니다. 너무 길어져 관리가 안돼 뺐는데 차후에 올리던가 다른 고수님들께서 해주시라 믿습니다. 1. 정확한 커넥션풀 퍼포먼스, 안정성 벤치마크 2. 여러 상용 WAS의 커넥션 풀 구조 분석 싱글레톤 패턴을 적용한 PoolManager를 첨부하니 참고하시면 사용이 편하실거 같습니다. 다음 문서에선 가장 추천받는 JDBC 자원관리가 되게끔 Wrapper 클래스 SQLUtil 클래스로 문서를 써보도록 하겠습니다. 추천코드를 보아도 이런저런 일로 개발자따라 close가 제대로 안되는 경우가 허다합니다. 거창한건 아니구 보시면 압니다. (-_)y~ 후 집에서 개발문서 쓰기 힘들군요. 그럼 또~ 레퍼런스 Bitmechanic 홈페이지 http:/ [출처] 오라클자바커뮤니티 - http://www.oraclejavacommunity.co.kr/bbs/board.php?bo_table=LecStruts&wr_id=179 오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급 www.oraclejavacommunity.com 평일주간(9:30~18:20) 개강 (5/28)[교육전취업확정]Spring,MyBatis,XPlatform실무프로젝트과정 (5/30)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 (5/30)[기업100%환급]SQL기초에서 Schema Object까지 (6/09)[기업100%환급]PL/SQL,ORACLE HINT,TUNING (6/09)[기업100%환급]안드로이드개발자과정 (6/09)[기업100%환급]Spring ,MyBatis,Hibernate실무과정 (6/16)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍 평일야간(19:00~21:50) 개강 (5/28)Spring3.X, MyBatis, Hibernate실무과정 (5/28)SQL초보에서실전전문가까지 (5/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 (6/03)안드로이드개발자과정 (6/03)웹퍼블리싱 마스터 (6/10)C#4.0, ADO.NET, Network 프로그래밍 (6/19)C#,ASP.NET마스터 주말(10:00~17:50) 개강 (5/31)Spring3.X, MyBatis, Hibernate실무과정 (5/31)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 (5/31)SQL초보에서실전전문가까지 (5/31)C#,ASP.NET마스터 (5/31)실무예제로 배워보는 jQuery(개발자/디자이너를위한) (5/31)안드로이드개발자과정 주말저녁(18:30~22:20) 개강 (6/21)JAVA,Network&WEB&Framework (6/21)SQL기초에서실무까지

Bitmechanic JDBC Connection Pool[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

<!--[if !vml]--><!--[endif]-->By 안기현, SCJP, msrichard25@hotmail.com,

인터넷에 여러가지 커넥션풀이 있지만 그 중에서도 제가 현재 적용해 쓰고 있는 Smart한 커넥풀을 소개할까합니다.

JDBC 리소스에 관한 고찰
<!--[if !vml]--><!--[endif]-->먼저 JDBC의 리소스 ResultSet, Statement, Connection에 대해 짚고 넘어갈 필요가 있습니다.

자바서비스넷 추천문서 코너의 [서블렛 + JDBC 연동시 코딩 고려사항 by 이원영]를 보면 가장 바람직한 JDBC 코딩 예제가 명확한 설명과 함께 올라와 있습니다.
Try-Catch문과 Finally를 이용해 어떤 상황에서도 정확하게 자원을 해제(close)할 수 있게끔 해놓았습니다.

왜 이렇게 확실하게 리소스를 해제해야 하는가그 대답은 JDBC 리소스들이 가비지콜렉터(GarbageCollector : 이하 GC) 대상이 아니기 때문입니다. (이 부분은 이원영씨의 문서에도 언급이 되어있는데 설명이… -_-.) 이 부분에 대한 설명은 썬의 자바포럼에 정확히 기재가 되어있어 언급을 할까 합니다.

The java garbage collection idiom was NOT developed with the intent of collecting 'resources.' It exists solely to collect memory, nothing else.
This is not all that extreme when one considers that most if not all of the the computer theory on garbage collection is based on collecting memory only.
Java does that very well.

In this case other resources are in use here. Java does not deal well with implicit handling of other types of resources. One should always explicitly deal with other resources, like
explicitly calling the close() method on Connection, Statementand ResultSet().

-_-;; 뭔말이냐면 자바 가비지 컬렉터는 자원을 모으기 위해서가 아니라 메모리를 모으기 위한 의도로 개발되었을 뿐이라는 겁니다그러므로 묵시적암시적인 자원 핸들링이 이루어지지 않음으로 항상 명시적으로 자원을 관리를 해줘야하고 정확히 close()를 호출해 주어야 합니다.

ResultSet, Statement, Connection는 되도록 멤버변수로 쓰지 마시고 로컬변수로 써주시고
한번 사용한 ResultSet, Statement, Connection 변수에 레퍼런스값(자바는 call by value이므로)을 재할당하지 않는 편이 좋습니다자세한 설명은 이원영씨의 추천문서에 나와있으니 꼭 읽어 보시길 바랍니다.

<!--[if !vml]--><!--[endif]-->Bitmechanic 커넥션풀의 동작
Bitmechanic 홈페이지의 ConnectionPool에 대한 FAQ와 예제를 참고해 정리했습니다.

먼저 프로퍼티를 보시는 편이 이해가 빠를 듯 합니다.
poolAlias=thinPool
jdbcDriver=oracle.jdbc.driver.OracleDriver
dbURL=jdbc:oracle:thin:@107.0.0.1:1521:orcl
dbUser=scott
dbPassword=tiger
reapConnInterval=300
maxConn=20
idleTimeout=60
checkoutTimeout=60
maxCheckout=15

특이한 프로퍼티로 poolAlias reapConnInterval, idleTimeout, checkoutTimeout, maxCheckout 이 보입니다.

poolAias JDBC 풀을 별명(Alias)를 줘서 여러 개의 풀을 이용할 수 있게 해줍니다.
(
저의 경우는 프로토콜 위반에러 때문에 thin방식과 oci방식 두가지의 풀을 이용합니다.)

reapConnInterval은 다른 커넥션 풀들과는 틀린 부분이고 bitmechanic 커넥션풀의 가장 중요한 옵션입니다. reapConnInterval을 두가지 경우에 커넥션 풀의 connVector에서 커넥션을 제거하게 됩니다. [reaping : 베어들이다거둬들이다]

1. 풀에서 conn이 나갔는데(checkout) checkoutTimeout 시간안에 돌아오지 않을 경우
2. 풀의 connVector에서 전혀사용되지 않는 상태(idle)로 idleTimeout 시간을 초과할 경우

bitmechanic 커넥션 풀은 (이하 BCP) 최대 Connection 수를 설정해도 무조건 20개면 20개 커넥션이 담겨져 있는 것이 아니라 필요에 따라 수를 채워가고 또 전혀 사용이 되지 않으면(Idle) 수를 줄입니다, maxConn 20이어도 사용특성에 따라 5개만이 풀에서 운용될 수도 있다는 얘깁니다그걸 가능하게 해주는 프로퍼티가 reapConnInterval 입니다.

## 참고
유저의 Connection 반환문제, JDBC 코딩에 있어서 Reference 문제, Container 문제 여러 복합적 상황에서 떠돌아 다닐  있는 Connection 등을 일정시간을 두어 제거해주므로 매우 유용합니다. BCP 적용하기 전에는 계속 톰캣을 restart 해줘야 했는데 적용 후에는 전혀 톰캣을 restart  일이 없어졌습니다


checkoutTimeout은 너무 짧게 설정해도 안되는게 정상적인 query 수행시간이 길다면 정상적으로 작동하는 query 수행 중에 Connection Reaping 해버리게 되므로 최대 쿼리 수행 시간보다는 크게 해둬야 합니다.

idleTimeout Thread 그 자체인 ConnectionPoolManager가 그 간격으로 수행을 하게 되므로 적당한 시간을 설정하면 될 듯 합니다. (데이터베이스의 불필요한 Open Session 수를 줄일 수 있슴)

maxCheckout은 풀에서 재사용되는 Connection이 일정 횟수를 넘으면 자원 해제(close)를 해버린다는 겁니다. Cursor Leak을 방지하기 위해서인데 두가지 경우에 생깁니다.
<!--[if !supportLists]-->1.   <!--[endif]-->유저가 ResultSet, Statement close()를 잊었거나 finally로 하지 않았을 경우
<!--[if !supportLists]-->2.   <!--[endif]-->벤더의 JDBC Driver Bug인 경우 (오라클의 8.0.5, 8.1.5 버전 JDBC 드라이버)
개인적으로 이 옵션에 대해 상당히 만족합니다유저의 실수와 벤더의 버그 모든 경우를 커버해주니까요. reapConnInterval도 마찬가지 입니다.


<!--[if !vml]--><!--[endif]-->Bitmechanic 커넥션풀 구조
일단 주요 BCP의 클래스를 설명하자면 다음과 같습니다.

ConnectionPoolManager
커넥션 풀을 관리 implements Driver, Runnable
1
ConnectionPool
실제 커넥션 관리 (connVec, closeVec)
N
PooledConnection
JDBC Conneciton Wrap 클래스
N * M

실제 위에서 본 프로퍼티값은 ConnectionPoolManager를 통해 ConnectionPool에 저장이 되고 그 값을 가지고 실제 작업을 수행하는 것은 ConnectionPool 입니다물론 ConnectionPoolManager가 호출을 하는 형식입니다.
여기서 유심히 보아야 할 부분이 ConnectionPoolManager 입니다각각 Driver Runnableimplements를 했습니다. Runnalbe Reaping을 주기적으로 수행하기 위해서라는 것이라 쉽게 생각되어지지만 왜 JDK Driver implements를 했느냐, Driver 클래스라면 생소할지 모르겠지만 아래 코드를 보면 생각이 날겁니다.

Class.forName(oracle.jdbc.driver.OracleDriver).newInstance()

JDK의 소스를 열어보면 Driver 오브젝트의 형태로 VM DriverManager에 등록되어 관리가 됩니다저장구조는 Vector 입니다.

ConnectionPoolManager Driver implements되어 VM에 등록이 되기 때문에 더욱 안정적인 Connection 자원 해제가 가능해지게 됩니다많은 종류의 커넥션풀은 일반 클래스들로 Container 클래스 로더에 의해 로딩되어 관리가 됩니다하지만 나름대로 버그가 있을 수도 있는 Container에 등록이 되게 되므로 안정적이고 신뢰성 있는 관리를 제공한다고 단언할 수 없는 것도 사실입니다.

## 참고
톰캣을 restart하면 모든 자원이 해제될 것이라고 생각되지만 톰캣 클래스 Loader VM 가비지콜렉터도 “메모리” 관리에 초점을 맞추었지 “자원” 해제를 해주지 않을 거라  생각이 됩니다. ( 부분은  조사를..-_-;;) , Reference 오브젝트만이 Unload되어 떠도는 Connection들이 축적될  있습니다그러다 결국 많은 DB 오픈 Conneciton Process들을 발견하고 DB restart 시켜야하는 상황까지 가게 됩니다. (경험담입니다.)

자바 클래스의 위치에서 본다면 OS 라고 할 수 있는 VM Driver로 등록된다는 것은 매우 큰 메리트를 준다고 할 수 있습니다.








사용법
<!--[if !vml]--><!--[endif]-->드디어 사용법이오서론이 길어 죄송했소~! (-_)y~ 죄송하오.
순서대로 보도록 하겠습니다.

커넥션 풀 매니저 등록
Class.forName(dbDriver);
//300, pool.reapIdleConnection() thread' method interval
cpm = new ConnectionPoolManager(reapConnInterval);
/*
 * 20,  // max connections to open
* 60,  // seconds a connection can be idle before it is closed
* 60,  // seconds a connection can be checked out by a thread
*      // before it is returned back to the pool
* 15,  // number of times a connection can be re-used before
       // connection to database is closed and re-opened
       // (optional parameter)
*/
cpm.addAlias(alias, dbDriver, dbUrl, dbUser, dbPass, maxConn, idleTimeout, checkoutTimeout, maxCheckout);
처음엔 다를거 없습니다. JDBC드라이버 등록해 주시고 커넥션 풀 메니저 생성해주고 alias를 준다음 등록시키면 내부적으로 ConnectionPoolManager DriverManager에 등록이 됩니다.

커넥션 얻어오기
Conn = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX + alias);
언뜻보면 풀에서 가져오는 것 같지 않아 보이지만 Drvier 클래스를 implement했기 때문에 내부적으로ConnectionPool에서 리턴이 됩니다.

커넥션 반환하기
if(conn != null) {
       try {
             conn.close();
       }catch(SQLException sqle) {
             log.writeLog(sqle);
       }
}
이 사람 거짓말 한다” 라고 생각될지도 모르겠습니다만 아닙니다. -_-;; BCP Connection Wrap PooledConnection을 쓰고 있습니다다형성(Polymorphism)을 이용했으므로 close()를 호출하면 내부적으로 freeConnection(conn)이 호출됩니다.

현재 풀 상태 보기
ConnectionPool cp = cpm.getPool("thinPool");
return cp.dumpInfo();
현재 몇 개의 커넥션이 풀에 올라와 있는지 언제 최종 Access되어있는지 등 많은 정보를 트리구조로 볼 수 있습니다좀 신경써주면 좋은 모니터링 페이지를 만들 수 있을 것 같습니다.

마무리
<!--[if !vml]--><!--[endif]-->문서 두번째 써보는데 양이 많아 시간이 많이 걸렸습니다대충 쓴 부분도 많아 꼭 지적을 해주시면 감사하겠습니다문서에 2가지 정도가 빠졌습니다너무 길어져 관리가 안돼 뺐는데 차후에 올리던가 다른 고수님들께서 해주시라 믿습니다.
<!--[if !supportLists]-->1.   <!--[endif]-->정확한 커넥션풀 퍼포먼스안정성 벤치마크
<!--[if !supportLists]-->2.   <!--[endif]-->여러 상용 WAS의 커넥션 풀 구조 분석
싱글레톤 패턴을 적용한 PoolManager를 첨부하니 참고하시면 사용이 편하실거 같습니다.

다음 문서에선 가장 추천받는 JDBC 자원관리가 되게끔 Wrapper 클래스 SQLUtil 클래스로
문서를 써보도록 하겠습니다추천코드를 보아도 이런저런 일로 개발자따라 close가 제대로 안되는 경우가 허다합니다거창한건 아니구 보시면 압니다. (-_)y~ 후 집에서 개발문서 쓰기 힘들군요그럼 또~

레퍼런스
<!--[if !vml]--><!--[endif]-->Bitmechanic 홈페이지                   http:/ 

댓글 없음:

댓글 쓰기