http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=was&c=r_p&n=970209527&k=DB2
제목 : Websphere V3 and V4 Connection Pool 사용법
글쓴이: 이원영(javaservice) 2000/09/29 15:38:47 조회수:24792 줄수:1242
WebSphere V3 and V4 Database Connection Pooling Guide2002년 01월 22일WebSphere/AD Technical Sales Support, IBM Korea 이원영Document History최근수정일자: 2001.01.19(7차)최근수정일자: 2001.02.19(8차) 일부권장수치 조정최근수정일자: 2001.04.26(9차) Oracle OCI 관련 수정최근수정일자: 2001.05.17(10차) MS-SQL JDBC 드라이버관련최근수정일자: 2001.06.03(11차) MS-SQL JDBC 드라이버관련추가최근수정일자: 2001.06.11(12차) Merant SequeLink 한글 문제 패치최근수정일자: 2001.06.25(13차) Sybase JDBC한글 문제 관련최근수정일자: 2001.06.26(14차) 기술자료집 문서양식으로 정리최근수정일자: 2001.11.01(15차) JTA관련 부분 추가최근수정일자: 2001.11.20(16차) ConnectionResource 권장샘플소스 재취합최근수정일자: 2001.12.25(17차) DataSource 테스트용 JSP 소스 수정최근수정일자: 2002.01.21(18차) WebSphere 4.0 관련 사항 추가최근수정일자: 2002.01.22(18차) WebSphere 4.0 AEs Sybase JDBC 설정법 추가본 문서는 IBM WebSphere Application Server Version 3.x 에서 JDBC(Java Database Connectivity)를 통해 각 Database 에 접속하기위해 설정하는 방법을 설명하기 위해 작성되었다. 그러나 WebSphere V3.5 및 V4에 대한 내용들로 함께 언급하고 있다.1. JDBC DRIVER 및 DATASOURCE 생성하기설명의 편의를 위하여 먼저 Oracle Database의 경우를 상세히 설명하고, 각 DB 별로 다시 설명한다. 작업순서는 다음과 같이 각각 3단계의 작업을 진행하여야 한다.1) JDBC Driver 생성2) JDBC Driver 설치3) DataSource 생성1.1 Oracle Database Server 1.1.1 Oracle JDBC Driver 생성 아래는 WebSphere 3.0.2.x 의 화면이지만, WebSphere 3.5.x에서도 별반 다르지 않다.  (WebSphere V4에서는 비록 화면은 많이 다르겠지만, 개념적인 작업의 흐름은 크게 다르지 않다)   위의 메뉴를 선택하면 아래와 같은 "JDBC 드라이버 작성"을 위한 화면이 뜬다.   "이름"은 임의로 부여하면 된다. 구현클래스: oracle.jdbc.driver.OracleDriver URL접두어(URL Prefix)는 JDBC Driver에 맞게 적어주되 "URL 접두어"이므로 실제   "DB명"은 기술하지 않는다. "DB명"은 향후에 "데이타소스(DataSource)" 를 만들 때, 그  때 기술하게 될 것이다. JDBC Type              URL Prefix                          JTA ------------------------------------------------------------------------------ Oracle Thin Type     : jdbc:oracle:thin:@192.168.0.1:1521  false Oracle OCI Type      : jdbc:oracle:oci8                    false ------------------------------------------------------------------------------NOTE: Oracle 8i(8.1.6)은 Thin/OCI 모두에서 JTA 를 사용할 수 없다. (Websphere Hanbook-sg246161, 12.2.2) # Oracle Thin Driver  경우의 예 NOTE: For WebSphere Version 4, oracle.jdbc.pool.OracleConnectionPoolDataSource (one-phase commit protocol) oracle.jdbc.xa.client.OracleXADataSource (two-phase commit protocol) Requires the following properties: - URL - The URL that indicates the database from which the datasource will obtain   connections. Example: "jdbc:oracle:thin:@myServer:1521:myDatabase", where   myServer is the server name, 1521 is the port it is using for communication, and   myDatabase is the database name. - user - The user name used when obtaining connections. Example: "scott" - password - The password for the specified user name. Example: "tiger"1.1.2 Oracle JDBC Driver 설치JDBC Driver 에 대한 항목만 "작성"하였지, 아직 JDBC Driver 클래스를 "설치"한 것은 아니다. 아래와 같이 위에서 만든 JDBC 드라이버 항목에 오른쪽 마우스를 이용하여 드라이버 클래스를 "설치"하여야 한다. 드라이버를 설치할 노드를 선택한 후 "찾아보기"를 선택하여 드라이버 클래스를 찾도록 한다. Oracle 의 경우, 8.0.5, 8.1.5, 8.1.6 등, Oracle버전에 따른 다양한 JDBC 드라이버가 각각 존재한다. 그러나, JDBC Type 4 형태인 Thin Type 으로 사용할 경우는, Oracle 8 마이너 버전에 관계없이 항상 최신의 JDBC Driver를 받으면 된다. JDK 1.1용은 이름이classes111.zip 혹은 classes111_01.zip 이란 형태로 되어 있다.반면, WebSphere 3.5.x 의 경우는 IBM JDK 1.2 를 사용하고 있으므로, JDK 1.2 용 Oracle JDBC Driver인 classes12.zip을 사용하여야 한다. JDBC 드라이버 파일을 선택한 후 "Open"을 누른 후, "설치"를 선택하면 된다. 또, JDK 1.2의 경우 Oracle JDBC Driver 에 함께 들어있는 nls_charset12.zip 은 반드시 admin.config 파일의 classpath 에 명시적으로 걸어 주어야 한다. 그렇지 않으면  DB에서 가져온 영문으로 된 문자조차 모두 일련의 숫자로 나타나는 현상이 일어날 것이다.아래 파일에서 다음과 같이 classpath 끝부분에 추가하면 된다. [$WAS_HOME/bin/admin.config] ..... com.ibm.ejs.sm.adminserver.classpath=.....D:/oracle/ora81/jdbc/lib/nls_charset12.zip .....NOTE:  Oracle OCI Type 은 WebSphere 3.0.2.3, 3.5.2 번부터 가능하다. 그러나, Oracle OCI Type은 WebSphere와는 무관하게  NT의 IBM JDK 1.1.x 환경상에서 core dump를 유발한다. 이는 IBM JDK 1.1.8 버전상의 문제라 보여진다. WebSphere에서 Oracle OCI형태로 DataSource를 만들기 이전에, 먼저 IBM JDK 1.1.x 와 Oracle OCI JDBC 테스트를 반드시 검증해 보아야 할 것이다. 반면, IBM JDK 1.2.2 이상에서 동작하는3.5.2 이상 버전에서는 Oracle OCI와 별 문제 없이 동작한다.NOTE:  Oracle OCI 방식으로 JDBC 접속을 하려면, 최소한 Oracle SQL*Net 이 로컬머신에깔려 있어야 한다. 왜냐하면, OCI 방식은 Oracle의 native library(*.so,*.dll)를 사용하기때문이다.  반면, Thin 방식으로 사용할 경우, classes111.zip(WebSphere 3.0.2.x:JDK1.1.x),classes12.zip(WebSphere 3.5.x:JDK1.2) 만 있으면 되고, oracle 서버에서 Oracle Listener가떠 있으면 된다.NOTE:  Oracle DB를 WebSphere의 Repository DB로 사용하는 것이 아니라면 classesXXX.zip을 $WAS_HOME/bin/startupServer.sh 나 $WAS_HOME/bin/admin.config 파일의 classpath에  설정하면 안 된다. 즉, admin.config 파일의 classpath 에 해당 zip 파일을 설정하는 방식이 아니라, 관리콘솔에서 해당 "JDBC드라이버"를 "생성"하고 "설치"할 때 지정해 주는 것으로 충분하다. 만약, 실수로, 관리콘솔에서 "JDBC드라이버"를 "생성"한 후 "설치" 하지 않은 채, 단지 admin.config 에서 classpath 에다가 classesXXX.zip 을 등록만 했을 경우, 처음엔 아무런 문제가 없는 듯이 동작하나, 얼마 동안 서비스 후, ds.getConnection() 시 에러없이 "null"이 return 되거나, NullPointerException 이 발생할 수 있다.만약, WebSphere 의 DataSource 를 이용한 Connection Pooling 을 이용하지 않고, 직접 JDBC Driver 를 이용하여 접속하는 경우가 있는데(Class.forName(...)), 물론 이는 바람직하지 않지만, 어떤 이유에서건 그렇게 하려면, 이 경우는 해당 *.jar(*.zip) 파일을 $WAS_HOME/bin/admin.config 파일의 classpath 에 걸어주어야 할 것이다.1.1.3  Oracle 용 DataSource 생성1.1.1, 1.1.2 번을 통해 만들어 둔 "JDBC 드라이버"를 이용하여 "DataSoure"를 등록하는 일이 남았다. DataSource의 "이름"은 임의로 부여하면 되고(프로그램소스에서 사용된다),  "데이타베이스 이름"은 물리적인 실제 DB명을 기제한다. Oracle의 경우 ORACLE_SID 에 해당한다. "드라이버" 항목은 리스트박스에서 1.1.1, 1.1.2 번을 통해 만든 JDBC 드라이버를 선택하면 된다. 앞서 "JDBC드라이버"를 생성할 때, URL Prefix 를 기술했었다. 그러나 이곳의 "데이타베이스이름"에는 DB URL의 나머지 부분을 입력해 주면 된다.JDBC Type            URL Prefix                          "데이타베이스이름"------------------------------------------------------------------------------Oracle Thin Type   : jdbc:oracle:thin:@192.168.0.1:1521   ORADBOracle OCI Type    : jdbc:oracle:oci8                     @ORADB------------------------------------------------------------------------------사실 JDBC드라이버의"URL Prefix"와 이 곳 "데이타소스"의 "데이타베이스이름"의 관계는 항상 위와 같을 필요는 없다. ":"(콜론)으로 구분된 JDBC Sub URL로 구분만 해 주면 된다. 예를 들어 Oracle Thin 드라이버의 경우, 다음과 같이 할 수도 있다는 것이다. "JDBC드라이버"에서의 URL Prefix      :   jdbc:oracle:thin "데이타소스"에서의 데이타베이스이름  :   @192.168.0.1:1521:ORCL따라서 다른 JDBC 드라이버에도 적절히 응용하여 DB URL을 여러 가지로 split 하여 사용할 수 있을 것이다. 아마도, WebSphere는 두 부분을 ":"이나 "/"로 붙여주는 듯하다."확장" 탭을 선택하면 다음과 같이 기본적인 디폴트 설정사항이 나타난다. 각 항목이 의미하는 바는 다음과 같다.최소 연결 풀 크기(Minimum connection pool size) 최초 요청 시 미리 맺어둘 Connection의 수이다. 사용자의 요청이 들어와야 실질적인 연결이 일어난다. 또한, 최초 요청 시에 이 수치만큼 전부 맺은 뒤라야 응답이 오게된다. 그러나, WebSphere 3.5.x 부터는 최초요청시에 곧바로 이 "최소연결개수"만큼을 무조건 맺지는 않도록 변경되었다. 동시에 들어오는 요청이 늘어남에 따라점차적으로 늘어나는 것으로 바뀌었으며 버전4에서도 이렇게 동작한다.만약, 점차적으로 늘어났다가, 요청이 줄어듬에 따라 점차적으로 줄어들어 이 수치에머물러 있게 된다.최대 연결 풀 크기 ( Maximum connection pool size ) 아무리 사용자가 몰리더라도 이 수치 이상은 연결되지 않는다. 동시 사용자수에 따라 대단히 중요한 파라미터 값이다. 이 값은 HTTP Server의 MaxClients 수치, 그리고, WebSphere의 OSE MaxConnection 수치와 함께  DB 성능을 고려하여 설정하여야 한다. 일반적으로 수치설정의 관계는 다음과 같이 될 것이다.HTTP MaxClients  >  OSE MaxConnection   >  DataSource MaxConnection연결 제한 시간 ( Connection timeout )Maximum connection을 모두 사용하고 있는 상태에서 또 다시 요청이 들어오면 이    시간만큼 가용한 connection이 생길 때 까지 기다리게 된다. 이 시간이 지나도록 가용한   connection이 없으면 ConnectionTimeoutException이 throw된다. 디폴트 값인 300초(5분)은 성능상의 관점에서 볼 때 너무 긴 시간이다. 사용자가 폭주하고 있는 상황에서 최대 5분 동안 waiting하게 한다는 것은 처리되지 못한 request 가 계속  큐잉될 가능성이 높아 지므로, 이 값은 1-3 초로 설정하는 것이 좋다. 가용한 Connection이 없으면 적당한 시점에 바로 return 되도록 하여야 hang 현상을 막을 수 있다. 단, 반드시 프로그램 소스에서는 Connection을 얻지 못했을 경우를 가정하고 Exception처리를 해 주어야 한다.(어느 버전에서부터인가 com.ibm.ejs.cm.pool.ConnectionTimeoutException이  com.ibm.ejs.cm.pool.ConnectionWaitTimeoutException으로 Exception클래스로 재명명 되었다.)유휴 제한 시간 ( Idle timeout )사용자가 몰려 많은 수의 Connection이 열렸다가 조용한 상태가 되었다고 가정할 때,    pool의 connection의 개수는 거의 maximum개수 가까이 올라가 있을 것이다. 이제   필요가 없으니 pool에서 날려버려야 하는데 얼마동안 기다렸다가 pool에서 제거   되겠느냐를 결정한다. 곧바로 pool에서 지워버리지 않는 이유는 사용자가 몰릴 때가   있고, 없을 때가 있는데, 늘 30개의 connection이 필요하다면 늘 30여 개로 맞추어져 있는 것이 효율적이기 때문이다. 그래서 이 idle timeout이 의미를 갖는다. 이 값은 Default 1800(30분)으로 그대로 둘 것을 권한다.모든 Connection이 항상 IdleTimeout값에 정확히 동작하는 것은 아니다. "최소연결풀크기"만큼의 연결은 최소한 남겨두기 때문이다. 만약 DataBase에서 IDLE한 연결을 강제로끊는 옵션이 지정되어 있다면, 최소한 "유휴제한시간"보다는 크게 설정되어 있어야 한다.그렇지 않으면 Connection Pool에 남아 있는 연결들은 이미 물리적으로 DB와는 단절된채로 남아 있을 수 있고, 이 Connection을 응용어플리케이션에서 사용하려 할 때,StaleConnectionException을 만나게 될 것이다. 또한, "최소연결풀크기"는 0으로마추어야 할 것이다. IdleTimeout이 지나더라도, "최소연결풀크기"만큼은 Pool에 남아있게 되고, 이 연결들은 어쩌면 Database에서 이미 물리적으로 끊어진 것들을 갖고 있을수 있기 때문이다. 따라서, Database에서는 IDLE한 시간이 지나면 물리적으로 끊어버리는옵션은 가급적 사용치 않기를 바란다. 많은 부분에서 JDBC Connection Pool 기능과이처럼 그 기능이 충돌하게 된다.WebSphere V3.5.x: com.ibm.ejs.cm.portability.StaleConnectionExceptionWebSphere V4.0.x: com.ibm.websphere.ce.cm.StaleConnectionException버리기 제한 시간 ( Orphan timeout )개발자의 실수로 connection pool에서 connection을 가져간 후 해당 connection을   close를 하지 않고 로직을 종료했다고 가정해 보면, 그 connection은 고아가 되어 다른 사용자도 사용치 못하고, 자원만 계속 점유하게 된다. Connection   Manager가 pool에 반환되지 않은 connection을 얼마동안 허용해 줄지를 결정하는   수치이다. 이 시간이 지나면 ConnectionManager 는 강제로 해당 Connection을 pool로 반환시킨다. 만약, 어떤 응용어플리케이션이 Connection을 할당받아 사용하다가, OrphanTimeout시간이지나도록 Pool에 반환하지 않은 채 사용하게 되면, 해당 Connection은 Orphan Mark가설정되게 되는데, 이 상태의 Connection에 작업을 시도하면, StaleConnectionException을만나게 될 것이다.Transaction에 관여한 Connection은 Orphan화 되지 않는다.Default : 1800(30분), 수정치 않고 그대로 둘 것을 권한다. 이 기능을 믿고 프로그램하는 것은 절대 바람직하지 않다. PreparedStatement Cache Size (Version 4.0)WebSphere의 특징적인 기능으로써, PreparedStatement를 close() 한다고 해서, 실제해당 PreparedStatement 가 close()되는 것은 아니다. 대신 그것이 WebSphere의해당 Connection내에 그대로 caching 되어 있게 된다. default는 100개이다.WebSphere V3 에서는 $WAS_HOME/properties/datasources.xml 파일에서 이를 지정해주었었다. Version 4 에서는 이곳 관리콘솔에서 지정해 줄 수 있다. 경우에 따라다르겠지만, default 100은 대부분의 경우 너무 높은 수치일 수 있다.2002.12.18 수정잘못알고 있었다. WebSphere V3/V3.5에서의  PreparedStatement cache size는 각connection당 각각 이 수치로 제한이 되었지만, WebSphere V4에서는 모든 connection에서cache된 총 사이즈의 제한개수이다. 따라서, V4에서 100이란 수치는 그리 높은 수치가아니다.예를들어, 이 수치가 100이라면, WebSphere V3/3.5에서는 각각 connection마다 100개까지caching되지만, WebSphere V4에서는 모든 connection에서 caching된 총 개수가 100개로제한된다.(The statement cache size is the number of cached statements for theentire pool, not per connection. (in Websphere V4))그러나, WebSphere V5에서는 다시 기존 V3/3.5때의 기능의 다시 돌아갈 예정에 있다.Disable Auto Connection Cleanup (Version 4.0)WebSphere V4에서는 disableAutoConnectionCleanup(DISABLE_AUTO_CONN_CLEANUP)옵션이 default가 false이다. 즉, Transaction mode가 false 일 경우는 commit()/rollback() 만으로도 해당 연결은 Pool에 반환되고, 더이상 사용하지 못하게 된다.commit()/rollback() 이후에 그 연결을 계속 사용하려 하거나, 심지어 conn.close()시에StaleConnectionException 이 발생하는 이유는 여기에 기인한다. 따라서, 명시적으로관리콘솔에서 해당 옵션을 true로 필요시 지정해 주어야 한다.마지막으로 "작성" 버튼을 눌러 작업을 완료한다.이제 설정작업은 끝이 났다. NOTE: "JDBC드라이버"의 정보가 변경되면 Application Server를 내렸다 올려야  반영이 된다(AdminServer를 내렸다 올릴 필요는 없다.) 반면, "데이타소스"의 정보를 변경할 경우는 곧바로 실시간 반영된다.1.2  IBM UDB DB2 자세한 생성 절차 및 방법은 앞서의 Oracle 경우의 순서를 참조하여야 할 것이다.1.2.1 JDBC 드라이버 생성JDBC 드라이버의 "이름"은 임의로 부여하면 된다. "구현클래스"는 App Driver 의 경우, 목록에서 선택하면 되고, Net Driver 위 경우는 직접 쳐 넣으면 된다.WebSphere Version 3.0.x, 3.5.xUDB DB2 App Driver(Type 2)  : com.ibm.db2.jdbc.app.DB2Driver (대소문자 주의)UDB DB2 Net Driver (Type 4)  : COM.ibm.db2.jdbc.net.DB2Driver (대소문자 주의)WebSphere Version 4COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource (one-phase commit protocol)COM.ibm.db2.jdbc.DB2XADataSource (two-phase commit protocol)URL접두어(URL Prefix) 는 각 JDBC Driver에 맞게 적어준다. 주의할 사항은 "URL 접두어"이므로 실제 "DB명"은 기술하지 않는다. 실제 "DB명"은 향후에  데이타소스(DataSource)를 만들 때, 그 때 기술하게 될 것이다. JDBC Type                URL Prefix                JTA ------------------------------------------------------------------------------ UDB DB2 App Driver     : jdbc:db2                  false UDB DB2 App Driver(JTA): jdbc:jta:db2              true UDB DB2 Net Driver     : jdbc:db2://192.168.0.1    false ------------------------------------------------------------------------------NOTE: JTA사용가능: JTA(Java Transaction API)는 필요에 따라 설정하면 된다. JTA가 "아니오"일 경우는 DataSource를 이용해 ds.getConnection(...)으로 꺼내온   java.sql.Connection의 auto commit mode 는 항상 "TRUE" 이다. 반면 "JTA사용가능"   상태에서는 Default 가 "FALSE" 가 된다.NOTE: HP-UX 용 DB2 (DB2 6.1 FP4/5, DB27.1 FP1)에서는 JTA가 지원되지 않는다. (WebSphere Handbook-sg246161,10.2)NOTE: WebSphere V3 에서 DataSource를 위한 UDB DB2 JDBC "App" Driver 는    "com.ibm.db2.jdbc.app.DB2Driver" 와 같이 "com.ibm."이 소문자로 시작한다. 반면, Net  Driver 는 "COM.ibm...." 와 같이 대문자로 시작된다. WebSphere의 DataSource에서  사용되지 않고, UDB DB2 JDBC "App" Driver로 직접 연결할 때의 원래 JDBC  Driver명은 "COM.ibm.db2.jdbc.app.DB2Driver" 와 같이 대문자로 시작된다. 또,  AS400에서 JDBC App Driver를 이용하여 직접 JDBC 연결을 할 경우는  "com.ibm.db2.jdbc.app.DB2Driver"와 같이 소문자로 시작된다. -------------------- 2001.07.20 추가 엔진 소스를 decompile 해 본 결과, "com.ibm.db2.jdbc.app.DB2Driver" 는 alias로서, 실제로는 "COM.ibm.db2.jdbc.app.DB2Driver" 으로 치환된다. 결국, 뭘 사용하든 상관없다.NOTE: UDB DB2 Net Driver를 사용하고자 할 경우, DB서버 측에서는 다음과 같이 아래의명령어를 통해 DB2 Java Demon (db2jd)가 실행되어 있어야 한다.$ db2jstrt [<port>]$ ps -ef |grep db2jd반면, Windows 계열의 경우, 제어판에서 "DB2 JDBC 애플릿 서버"가 시작되어 있어야 한다.port 를 명시적으로 기술하지 않으면 6789 번 port 가 사용된다. Default port 이 외의 경우는 앞서 JDBC Driver 의 URL Prefix  기술 시 명시적으로 기술해 주어야 한다.UDB DB2 Net Driver    : jdbc:db2://192.168.0.1:10041.2.2 UDB DB2 JDBC Driver 설치App Driver 이든, Net Driver 이든, db2java.zip 을 선택하여 "설치" 하면 된다.  구체적인 설치 절차는 앞서 Oracle 의 경우를 참조하면 될 것이다.NOTE: Windows 계열에 설치된 UDB DB2의 경우, JDK 1.2 기반의 WebSphere 3.5.x 에서는 반드시 사전에  .../sqllib/java12/usejdbc2.bat 파일을 실행하여야 한다. 해당 batch 파일을 실행  하면 기존의 파일을 sqllib/java11/ 디렉토리를 만들어 백업해 둔 후   sqllib/java12/jdbc20.exe 를 실행하여 만든 파일들을 sqllib/java/ 디렉토리에 자동으로 복사하게 된다.  반면, JDK 1.1 기반의 WebSphere 3.0.2.x 의 경우는 반대로 ../sqllib/java12/usejdbc1.bat를 실행해 주어야 할 것이다. 어쨌든, db2java.zip은 항상 sqllib/java/db2java.zip 을 "선택"하면 된다.NOTE: Unix 계열의 경우는 JDK 1.1 이나 JDK 1.2 냐에 따라 sqllib/java/db2java.zip과  sqllib/java12/db2java.zip 을 디렉토리별로 선택적으로 사용하여야 한다. Unix 계열의 경우는 sqllib/java12/usejdbc[12] 파일이 물리적으로 어떤 파일을 복사하거나 이동시키지 않으며 단지 환경변수를 잡아주는 역할만 한다. 따라서, 다음과 같이 선택적으로 환경변수를 사전에 잡아 주어야 한다. (leading "." 에 주의)JDK 1.1.x  (sh/ksh/bash shell 의 경우)$ .  /home/db2inst1/sqllib/db2profile$ .  /home/db2inst1/sqllib/java12/usejdbc1JDK 1.2.x (sh/ksh/bash shell 의 경우)$ .  /home/db2inst1/sqllib/db2profile$ .  /home/db2inst1/sqllib/java12/usejdbc2따라서 DB2 user나 WebSphere user의 .profile과 startupServer.sh 에서 위와 같이 환경변수를 사전에 반드시 잡아 줄 필요가 있다.NOTE: AIX의 경우 Local 머신에 있는 DB2 를 App Driver 로 접속할 계획이라면,  반드시 TCP/IP catalog 를 설정한 후 사용토록 해야 한다.AIX UDB DB2 TCP/IP Remote Catalog 설정법 http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=9738408301.2.3 UDB DB2를 위한 DataSource 생성DataSource의 "이름"은 임의로 부여하면 되고(프로그램소스에서 사용된다),  "데이타베이스 이름"은 물리적인 실제 DB명을 기술한다. "드라이버" 항목은 리스트박스에서 앞서 만든 JDBC 드라이버를 선택하면 된다."데이타베이스이름"에는, 앞서 "JDBC드라이버"를 생성할 때, URL Prefix를 기술했었다. 이곳에선 접속하려는 "데이타베이스이름"만 기술하면 된다. JDBC Type                URL Prefix                      "데이타베이스이름" ------------------------------------------------------------------------------ UDB DB2 App Driver     : jdbc:db2                         was UDB DB2 App Driver(JTA): jdbc:jta:db2                     was UDB DB2 Net Driver     : jdbc:db2://192.168.0.1           was ------------------------------------------------------------------------------"확장" 탭을 선택하여 pool 에 관련한 설정사항이 수정한다. 자세한 것은 앞서의 Oracle 경우를 참조하면 된다.1.3 AS400 DB 사용자를 위한 가이드구체적인 생성 및 절차 방법은 마찬가지로 앞서의 Oracle 경우를 참조해야 할 것이다.AS400 에 설치된 AS400 DB2 를 사용하려면, Local 혹은 Remote AS400 에서 접근하든, AS400 DB2에서 "AS/400 Toolbox for Java" 라고 불리는 jt400.zip(jar) 파일을 사용하면 된다. Unix Box 의 WebSphere 에서 AS400 DB 를 사용하는 경우라면 jt400.jar 파일을 복사해 와서 사용하면 될 것이다.만약 어떠한 이유에서건, WebSphere에서 Connection Pool로 등록하여 DataSource를 사용하여 접근치 않고, JDBC Driver 만으로 직접 연결하는 방법은 아래와 같았다. JDBC Driver : com.ibm.as400.access.AS400JDBCDriver DB URL : jdbc:as400://192.168.0.1/Library명 DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());  Connection conn = DriverManager.getConnection(                     "jdbc:as400://192.168.0.1/Library명",                     "user","passwd");따라서, WebSphere V3에서 DataSource를 이용한 Connection Pool 기능을 사용하려면 "Library명"을 제외한 부분을 URL Prefix 로 작성하면 된다. JDBC Driver     : com.ibm.as400.access.AS400JDBCDriver URL Prefix : jdbc:as400://192.168.0.1"Library명"은 차후 DataSource를 만들 때 "데이타베이스이름" 에 기술하면 된다.NOTE: 만약, AS400 Box에 설치된 WebSphere 에서 원격지 Unix 머신의 UDB DB2 를 접근하는 방법은 Remote UDB DB2 를 AS400 DB2에 Alias를 등록한 후, Local AS400 DB2를 접근 하듯이 하거나, Remote UDB DB2 의 db2java.zip 을 AS400 에 복사한 후 DB2 Net Driver 방식으로 접근할 수 있다. 어떤 것이 더 바람직한 지는 직접 확인해 주기 바란다.NOTE: Target DB 가 무엇이냐에 따라 어떤 JDBC 드라이버를 사용할지를 결정하게 된다. 접속하려는 DB가 AS400 DB2 라면 AS400 DB2 접속방법에 따르면 되고, 접속하려는 DB가 Remote에 있는 Unix UDB DB2 라면 UDB DB2 접속방법을 따르면 된다.PS: jt400.jar(zip)은 어디서 구하나요?   글쓴이: 김원덕(takgyun)   2001/08/22 09:07:34   AS/400 DB를 사용하신다고 했으니까 당연히 AS/400이 있을겁니다.   그렇다면. AS/400에 FTP로 접속하신 후 /QIBM/ProdData/HTTP/Public/jt400/lib에    가시면 jt400.zip 이나 jt400.jar 가 있습니다.NOTE: For WebSphere Version 4,iSeries Toolbox driver:com.ibm.as400.access.AS400JDBCConnectionPoolDataSource (one-phase commit protocol)com.ibm.as400.access.AS400JDBCXADataSource (two-phase commit protocol)Requires the following properties:  serverName - The name of the server from which the datasource will obtain       connections. Example: "myserver.mydomain.com"iSeries Native driver:com.ibm.db2.jdbc.app.DB2StdConnectionPoolDataSource (one-phase commit protocol)com.ibm.db2.jdbc.app.DB2StdXADataSource (two-phase commit protocol)No required properties.1.4 Microsoft SQL Server 실제 생성하는 절차나 방법은 앞서의 Oracle 경우를 참조하여야 할 것이다.1.4.1 MS-SQL JDBC-ODBC 브릿지MS-SQL 서버의 경우, 제어판에서 "데이타원본(ODBC)"를 통해 "사용자DSN"을 설정한 후 JDBC-ODBC 브릿지 드라이버를 이용하여 WebSphere 의 DataSource를 만들어 접속할 수 있다.  구현클래스                    URL Prefix                   JTA ------------------------------------------------------------------------------ sun.jdbc.odbc.JdbcOdbcDriver: jdbc:odbc                    false ------------------------------------------------------------------------------JDBC 드라이버를 "설치"할 때, 위 클래스는 JRE 의 rt.jar 에 이미 포함되어 있으므로  rt.jar 를 선택하면 된다.WebSphere 가 JDBC-ODBC 드라이버를 사용할 때, 정확히 무엇 무엇을 지원하지 않는지는 정확히 알려지지 않았으나, 정상적인 접속 및 사용이 가능하였고, 한글문제도 발생하지 않았다.  단, 호출 시에 WebSphere관리콘솔에서 다음과 같은 Warning 성 에러가 발생하였다."01-06-03 오후 9:39 : WARNING [lwy/AppServer]: CONM0002W: 인식되지 않는 데이터베이스 또는 드라이버 "sun.jdbc.odbc.JdbcOdbcDriver", 일반 설정값 사용"이 같은 Warnning 성 메세지는 WebSphere 엔진에서 기 등록되어 있지 않은 여하한의JDBC Driver 를 사용할 경우에 나타난다. 그러나, 사용상에는 문제없는 듯이 정상적으로수행은 된다. (그러나 보장은 못할 일이다)1.4.2 Merant SequeLink JDBC Driver그러나, WebSphere 3.5.3 부터 Merant SequeLink 라는 3-party JDBC Driver를 이용하여공식적으로 MS-SQL Server 지원을 하고 있으며 Persistence Repository DB로도 사용할수 있다.Merant SequeLink JDBC 드라이버는 server 제품과 client 제품으로 나뉘는데,WebSphere3.5 fixpack 3 번을 설치하면 lib 디렉토리에 sljc.jar, sljcx.jar 파일이 존재하는데이것이 Merant SequeLink JDBC Driver client 패키지이다.또한, 아래 사이트에서 Merant SequeLink Server 제품을 다운받아 MS-SQL서버가 위치한머신에 추가로 설치해야 한다.Merant JDBC driver Server Package Supporthttp://www-4.ibm.com/software/webservers/appserv/efix.htmlftp://ftp.software.ibm.com/software/websphere/merant/sl51sqlsrvr.zipsetup.exe 를 수행하여 일반적인 제품설치와 같이 하면 되고, 설치 중간에 serial 번호  와 라이센스Key 를 넣는 곳이 있으나 무시하고 "취소"하면 된다. 이는 Merant 제품이  WebSphere의 OEM 방식으로 client 패키지가 내장되어 있기 때문에, WebSphere의   DataSource 를 이용하여 접근할 경우 serial number 가 없어도 접속이 가능하기 때문이다.설치 후 제어판에서 "SLAgent51" 과 "SLSQLServer51" 항목이 "시작"되었는지 확인하면된다. JDBC 드라이버를 생성할 때, 아래의 정보가 필요할 것이다.구현클래스: com.merant.sequelink.jdbc.SequeLinkDriverURL Prefix: jdbc:sequelink://192.168.0.1:19996JDBC 드라이버를 "설치" 할 때는 WebSphere 3.5.3 의 lib 디렉토리에 있는 sljc.jar 를  "선택"하면 된다.DataSource 를 "생성"할 때, "데이타베이스이름"은 MS-SQL Server에서 만든 DB명을  기술하면 된다.NOTE: Merant SequeLink JDBC 드라이버를 사용할 경우, 반드시 WebSphere 의 DataSource를 통해서만 접속이 가능하다. 만약 다음처럼 WebSphere의 DataSource를사용치 않고 일반적인 방법으로 접근을 시도하면 다음과 같은 에러를 발생한다.Class.forName("com.merant.sequelink.jdbc.SequeLinkDriver");Connection conn = DriverManager.getConnection(     "jdbc:sequelink://192.168.0.1:19996/db", "userid", "password");  .....[MERANT][SequeLink JDBC Driver][SequeLink Server]License verification failed.NOTE: JDBC-ODBC 와 Merant SequeLink 드라이버의 아키텍쳐상 큰 차이라면,  ODBC-JDBC경우는 ODBC "데이타원본(DSN)"을 만들어 접속해야 하므로 반드시 WebSphere 가 설치된머신에 ODBC 환경이 구축되어야 하는 반면, Merant JDBC드라이버의 경우, WebSphere는어디에 있든 Merant SequeLink Server로 TCP/IP 접속하니 JDBC Type 4 처럼 접속할 수있게 된다.NOTE: 아직 "한글문제"가 다소 있다. 항상 "8859_1" 캐릭터셋으로만 데이타가  전달되는 듯 하다. JVM의 "file.encoding" 값을 "8859_1" 로 마추어 사용하는 경우는  문제가 없지만, "KSC5601"로 마추어 사용하는 경우는 다음처럼 인코딩을 해야 한다.String _ename = rs.getString("ENAME");String ename = new String(_ename.getBytes("8859_1"), "KSC5601);....이 문제를 해결하기 위해선 다음과 같은 패치 작업이 필요하다.(2001.06.11현재)2001.06.11 추가 Merant SequeLink 한글 문제 패치제어판에선 "SLAgent51" 과 "SLSQLServer51" 이 '시작'되어 있음을 확인한 후, 시작--> 프로그램 --> "SequeLink Server 5.1 for MSSQL Server" --> "SequeLink 5.1   Manager Snapin" 을 기동한다.Console Root     --> SequeLink 5.1 Manager (localhost)       --> Connected to SLAgent51        --> SequeLink Services          --> SLSQLServer51 [active]            --> Configuration              --> Services Settings                --> Advanced에서 우측마우스클릭--> 새로만들기 --> "Attribute" 선택 하여, 아래의 항목을 선택/추가한다.Attribute : ServiceCodePageValue : OS메뉴--> 콘솔 --> '저장' 하고, 제어판에서 SequeLink Server 를 새로 기동한다.WebSphere 의 $WAS_HOME/lib/sljc.jar 파일을 적당한 곳에서 "jar xvf sljc.jar" 와 같이압축을 푼 후, 아래의 파일을 편집하여 다음 라인들을 추가로 삽입한다.[com/merant/sequelink/slje.properties].....translit.type.949=VMtranslit.name.949=KSC5601translit.type.MS949=VMtranslit.name.MS949=KSC5601translit.type.Cp949=VMtranslit.name.Cp949=KSC5601translit.type.KSC5601=VMtranslit.name.KSC5601=KSC5601translit.type.EUC_KR=VMtranslit.name.EUC_KR=KSC5601....이제 다시 "jar cvf sljc.jar com intersolv" 를 통해 다시 압축하여 jar 파일로 만든다. 기존의 sljc.jar 는 백업해 두고, 이렇게 패치된 sljc.jar 를 사용한다.NOTE: For WebSphere Version 4, com.merant.sequelink.jdbcx.datasource.SequeLinkDataSource  (one- and two-phase commitprotocol) Requires the following properties: - serverName - The name of the server in which SequeLinkServer resides. Example:                "myserver.mydomain.com" - portNumber - The TCP/IP port that SequeLinkServer uses for communication. By                default, SequeLinkServer uses port 19996. Example: "19996" - databaseName - The name of the database from which the datasource will obtain                connections. Example: "Sample" - user - The user name used when obtaining connections. Example: "scott" - password - The password for the specified user name. Example: "tiger" - disable2Phase - By default, this datasource always creates two-phase connections.                To use one-phase connections, set this property to true. The same DataSource implementation class is used for both non-JTA and JTA-enabled datasources. Also, this class is found in sljcx.jar, not sljc.jar. -------------------------- 2002.4.22 추가 Microsort의 MS-SQL서버는 Merant JDBC Driver를 인수하여 "MS JDBC Driver"라는 이름으로 re-branding/re-packaging 하여 제공하고 있다. 보다 자세한 사항은 아래의 글들을 참고하라. 69  Re: MS의 JDBC사용시 한글 문제  http://www.javaservice.net/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=10100835731.5 Sybase DataBase자세한 생성 절차 및 방법은 앞서 경우의 순서를 참조하여야 할 것이다. 각 Sybase 가제공하는 j-Connect5.2 JDBC 드라이버를 이용하여 접속한다. 나머지 절차는 앞서의 경우를참조한다. 1) JDBC 드라이버 생성 JDBC Driver 생성 JDBC Driver                      URL Prefix                          JTA ------------------------------------------------------------------------------ com.sybase.jdbc.SybDriver      : jdbc:sybase:Tds:192.168.0.1:5000    false com.sybase.jdbc2.jdbc.SybDriver: jdbc:sybase:Tds:192.168.0.1:5000    true ------------------------------------------------------------------------------2) DataSource 생성 Sybase j-Connect JDBC Driver를 이용할 경우, 한글을 사용하기 위해 DataSource의  "데이터베이스이름"에 다음과 같이 특별한 인코딩 옵션을 주어야 한다.   데이터베이스 이름: dbname?CHARSET=eucksc NOTE: For WebSphere Version 4,  com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource (one-phase commit protocol)  com.sybase.jdbc2.jdbc.SybXADataSource (two-phase commit protocol)  Requires the following properties:  - serverName - The name of the database server. Example: "myserver.mydomain.com"  - portNumber - The TCP/IP port number through which all communications to the                 server take place. Example: 4100  - connectionProperties	CHARSET=eucksc NOTE: For WebSphere 4.0 + Sybase JDBC 설정법   http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=10116520341.6 Informix Database 1) JDBC 드라이버 생성 JDBC Driver 생성 JDBC Driver                  URL Prefix                                   JTA ------------------------------------------------------------------------------ com.informix.jdbc.IfxDriver: jdbc:informix-sqli://192.168.0.1:20000/webdb false ------------------------------------------------------------------------------ 2) DataSource 생성 informix 의 경우는 특별나다. URL Prefix에 "데이터베이스이름"까지 주고,  DataSource에서는    ":informixserver=webdb_info73_net" 과 같이 부가적인 것을  주어야 한다. 이는 WebSphere 가 Driver URL 과 DataSource DB name 을 concat 하는  과정에서  뭔가 ":", "/" 등이 자동으로 들어가기 때문으로 것으로 보인다. NOTE: For WebSphere Version 4, com.informix.jdbcx.IfxConnectionPoolDataSource (one-phase commit protocol) com.informix.jdbcx.IfxXADataSource (two-phase commit protocol) Requires the following properties: serverName - The name of the Informix instance on the server.               Example: "ol_myserver" portNumber - The port on which the instances is listening. Example: "1526" ifxIFXHOST - The physical name of the database server.               Example: "myserver.mydomain.com" databaseName - The name of the database from which the datasource will obtain              connections. Example: "Sample" user - The user name used when obtaining connections. Example: "scott" password - The password for the specified user name. Example: "tiger" informixLockModeWait - Although not required, this property enables you to set              the number of seconds that Informix waits for a lock. By default,              Informix throws an exception if it cannot immediately acquire a              lock. Example: "600"1.7 MySQL There are 2 supported JDBC drivers for MySQL (the mm driver and the Reisin JDBC driver). You can and a copy of the mm driver at http://mmmysql.sourceforge.net/ or http://www.mysql.com/Downloads/Contrib/ and the Reisin driver at  http://www.caucho.com/projects/jdbc-mysql/index.xtp For documentation consult any JDBC documentation and the driver's own documentation for MySQL-specific features.1.7.1 mm Driver http://mmmysql.sourceforge.net/ A JDBC Type 4 JDBC driver for MySQL. JDBC Driver               URL Prefix                          JTA ------------------------------------------------------------------------------ org.gjt.mm.mysql.Driver : jdbc:mysql://192.168.0.1:3306       false ------------------------------------------------------------------------------1.7.2 Caucho MySQL JDBC Driver http://www.caucho.com/projects/jdbc-mysql/index.xtp JDBC Driver :  com.caucho.jdbc.mysql.Driver URL Prefix  :  jdbc:mysql-caucho://192.168.0.1:3306 JTA         :  false PS: Full JDBC URL :jdbc:mysql-caucho://192.168.0.1:3306/db_name1.8 InstantDB For WebSphere Version 4, Com.ibm.ejs.cm.portability.IDBConnectionPoolDataSource (one-phase commit protocol) Requires the following properties: url - The URL that indicates the database from which the datasource will obtain       connections. Example: "jdbc:idb:configuration_file" where configuration_ file       is the name of the IDB configuration file.2. 테스트제대로 동작하는지 확인조차 하지 않고, 곧바로 응용어플리케이션 테스트로 이어지는 것은 바람직하지 않을 것이다. 아래와 같은 JSP로 간단히 DataSource를 이용한 Connection Pool 기능을 확인할 수 있다. ( JSP 1.0/1.1 지원확인 )[pool_test.jsp] for IBM WebSphere 3.0.x, 3.5.x, V4.0.x, ----------8><------------------------------------------------------------------<%@ page session="false" contentType="text/html;charset=euc-kr" %><%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %><%!    private static final String userid = "userid";    private static final String password = "password";    private static DataSource ds = null;    private static final Object lock = new Object();%><html><body><xmp><%    try {        synchronized ( lock ) {            // static variable, "ds", will be initialized only once at the first call.            if ( ds == null ) {                Context ctx = null;                java.util.Hashtable env = new java.util.Hashtable();                // (1.1) For WebSphere Version 3.0.x, 3.5.x,                env.put(Context.INITIAL_CONTEXT_FACTORY,                    "com.ibm.ejs.ns.jndi.CNInitialContextFactory");                                // (1.2) For WebSphere Version 4.0,                //env.put(Context.INITIAL_CONTEXT_FACTORY,                //    "com.ibm.websphere.naming.WsnInitialContextFactory");                Context ctx = null;                try {                    ctx = new InitialContext(env);                    // (2.1) For WebSphere Version 3.0.x, 3.5.x,                    ds = (DataSource)ctx.lookup("jdbc/datasource_name");                    // (2.2) For WebSphere Version 4, using global JNDI name as V3.5                    //       style, It works, but not recommended.                    // ds = (DataSource)ctx.lookup("jdbc/datasource_name");                    // (2.3) For WebSphere Version 4, local-binding JNDI name for                     //    J2EE1.2. 아래처럼 사용하려면, DataSource등록시 기재된                    //    "jdbc/datasource_name"을 AAT(Application Assembly Tool)에서                    //    assemble할 때나, Admin Console에서 Deploy할 때 EJB reference                    //    부분에서 "java:comp/env/jdbc/datasource_name"등과 같이 JNDI                     //    local binging 해 주어야 함.                    // ds = (DataSource)ctx.lookup                    //         ("java:comp/env/jdbc/datasource_name");                }                finally{                    if ( ctx != null ) try{ctx.close();}catch(Exception e){}                }            }        }        Connection conn = null;        Statement stmt = null;        try {            // (3.1) For WebSphere Version 3.0.x, 3.5.x,            conn = ds.getConnection(userid, password);            // (3.2) For WebSphere V4, you can set the default userid and password            // at the connection pool configuration on the admin console.            // conn = ds.getConnection();            stmt = conn.createStatement();            ResultSet rs = stmt.executeQuery("select * from emp");            while(rs.next()){                out.println(                    "empno=" + rs.getString(1) + ", ename=" + rs.getString(2)                );            }            rs.close();        }        finally {            if ( stmt != null ) try { stmt.close();}catch(Exception e){}            if ( conn != null ) try { conn.close();}catch(Exception e){}        }    }    catch(Exception e){        java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();        java.io.PrintWriter pw = new java.io.PrintWriter(bos);        e.printStackTrace(pw);        pw.flush();        out.println(bos.toString());    }%></xmp></body></html>----------8><------------------------------------------------------------------NOTE: WebSphere 3.0.2.x 라면 import 문이 다음처럼 되어야 한다. <%@ page import="java.sql.*,com.ibm.db2.jdbc.app.stdext.javax.sql.*,                 com.ibm.ejs.dbm.jdbcext.*,javax.naming.*" %> 반면 Websphere 3.5.x/4.0.x 라면 import 문이 다음처럼 되어야 한다. <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %> Version 4.0    The initial context factory name has changed from    com.ibm.ejs.ns.jndi.CNInitialContextFactory (Version 3.5) to    com.ibm.websphere.naming.WsnInitialContextFactory (Version 4.0). Version 4.0    In Version 4.0, the JNDI lookup string has changed. In Version 3.5, the    lookup would be the following:    javax.sql.DataSource ds =         (javax.sql.DataSource) ctx.lookup("jdbc/datasourcename");    In Version 4.0, the lookup is:    javax.sql.DataSource ds =        (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/datasource_name");NOTE: 위 샘플은 단지 테스트를 위해 간단히 제공하는 것 뿐이다. 실프로젝트에서 그대로  사용하면 안된다. NOTE: 매 요청마다 InitialContext JNDI lookup을 통해 ds를 새로 할당하는 것은 성능을  떨어뜨린다. ( ds.getConnection() 은 Thread-safe 하다.)NOTE: 2002.1.12 추가 어느 버전인가부터 매번 ctx.lookup()을 하여도 내부적으로 DataSource인스턴스에 대한 cache를 사용하기 때문에, 특별히 성능저하가 없다. 따라서, 앞서의 "NOTE"는 정정한다. 그러나, new InitialContext()는 여전히 적잖은 부하가 있다.3. 실질적인 응용 어플리케이션에서 프로그래밍 방법먼저, JDBC Connection Pooling에 대한 기본적인 마인드를 갖는 것이 중요하다.아래의 WebSphere V3에 관련한 소스들과 샘플을 보기 전에, 우선적으로 아래 글을숙독할 것을 권한다.서블렛 + JDBC 연동시 코딩 고려사항 -제2탄-http://javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=9685220773.1 DB Connection Adapter 클래스[org/jsn/connpool/ConnectionResource.java]----------8><------------------------------------------------------------------package org.jsn.connpool;/* * ConnectionResource V 2.0 * JDBC Connection Pool Adapter for IBM WebSphere V 3.0.2.x/3.5.x/V4.0 * Author: WonYoung Lee, lwy@kr.ibm.com, javaservice@hanmail.net * Last Modified : 2001.11.20 * NOTICS: You can re-distribute or copy this source code freely,  *         but you can NOT remove the above subscriptions. *//* * NOTE: WebSphere 3.0.2.x(JDK1.1.8)에서 import 부분은 다음과 같다. * import com.ibm.ejs.dbm.jdbcext.*; * import com.ibm.db2.jdbc.app.stdext.javax.sql.*; * import javax.naming.*; * import java.sql.*; * 반면, WebSphere 3.5.x(JDK1.2.2), V 4.0.x(JDK 1.3) 에서는 다음과 같다. * //import com.ibm.ejs.dbm.jdbcext.*; * //import com.ibm.db2.jdbc.app.stdext.javax.sql.*; * import javax.sql.*; // <-- 추가 * import javax.naming.*; * import java.sql.*; *///import com.ibm.ejs.dbm.jdbcext.*;//import com.ibm.db2.jdbc.app.stdext.javax.sql.*;import javax.sql.*;import javax.naming.*;import java.sql.*;import java.text.SimpleDateFormat;public class ConnectionResource{    private static boolean DEBUG_MODE = true;    private static long WARNNING_MAX_ELAPSED_TIME = 3*1000; //3 seonds    private static String userid ="userid";    private static String password ="password";    // 위의 static 변수들은 실 프로젝트에선 별도의 방법으로 제공받는 것이    // 바람직하다. 특정 구성파일로부터 읽어들이는 방법이 한 예가 될 것이다.    private static DataSource ds = null;     private static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd/HHmmss");    private static int used_conn_count = 0;    private static final Object ds_lock = new Object();    private static final Object count_lock = new Object();    private Connection conn = null;    private String caller = "unknown";    private long starttime = 0;    // detault constructor    public ConnectionResource()    {        // 필요하다면, 위의 userid, password등을 구성파일로부터 초기화하는        // 과정을 넣을 수 있겠다.        ;     }    // For debugging, get the caller object reference    public ConnectionResource(Object caller_obj)    {        this();        if ( caller_obj != null )             caller = caller_obj.getClass().getName();    }    public Connection getConnection()  throws Exception    {         synchronized( ds_lock ) {            if ( ds == null ) {                java.util.Hashtable env = new java.util.Hashtable();                // (1.1) For WebSphere Version 3.0.x, 3.5.x,                env.put(Context.INITIAL_CONTEXT_FACTORY,                    "com.ibm.ejs.ns.jndi.CNInitialContextFactory");                                // (1.2) For WebSphere Version 4.0,                //env.put(Context.INITIAL_CONTEXT_FACTORY,                //    "com.ibm.websphere.naming.WsnInitialContextFactory");                Context ctx = null;                try {                    ctx = new InitialContext(env);                    // (2.1) For WebSphere Version 3.0.x, 3.5.x,                    ds = (DataSource)ctx.lookup("jdbc/datasource_name");                    // (2.2) For WebSphere Version 4, using global JNDI name as V3.5                    //       style, It works, but not recommended.                    // ds = (DataSource)ctx.lookup("jdbc/datasource_name");                    // (2.3) For WebSphere Version 4, local-binding JNDI name for                     //    J2EE1.2. 아래처럼 사용하려면, DataSource등록시 기재된                    //    "jdbc/datasource_name"을 AAT(Application Assembly Tool)에서                    //    assemble할 때나, Admin Console에서 Deploy할 때 EJB reference                    //    부분에서 "java:comp/env/jdbc/datasource_name"등과 같이 JNDI                     //    local binging 해 주어야 함.                    // ds = (DataSource)ctx.lookup                    //         ("java:comp/env/jdbc/datasource_name");                }                finally{                    if ( ctx != null ) try{ctx.close();}catch(Exception e){}                }            }        }        if ( conn != null ) throw new Exception            ("You must release the connection first to get connection again !!");        // (3.1) For WebSphere V 3.0.x, 3.5.x,        conn = ds.getConnection(userid, password);        // (3.2) For WebSphere V4, you can set the default userid and password        // at the connection pool configuration on the admin console.        // conn = ds.getConnection();        synchronized( count_lock ) { ++used_conn_count; }        starttime = System.currentTimeMillis();        return conn;    }    // 사용하고난 connection을 DB Connection Pool로 반환하는 아래의 release()    // 메소드에는 굳지 파라메터로 그 Connection의 reference를 받아올 필요는    // 없다. 이미, 이 클래스의 member변수 'conn'을 갖고 있기 때문이다.    public synchronized void release() {          if ( conn == null ) return;        // 아래는 performance 적인 이슈가 발생할 수 있으나, auto-commit 모드가        // false 인 상태에서 commit/rollback 없이 release 하는 것과 같은        // 개발자의 코드를 신뢰할 수 없다면, 다음과 같은 조치가 필요하다.        boolean mode = true;        try{            mode = conn.getAutoCommit();        }catch(Exception e){}        if ( mode == false ) {            try{conn.rollback();}catch(Exception e){}            //WebSphere V3/V4 에서, 아래는 필요없음.            //try{conn.setAutoCommit(true);}catch(Exception e){}        }        try{ conn.close(); }catch(Exception e){}        conn = null; //<--- !!        int count = 0;        synchronized( count_lock ) { count = --used_conn_count; }        if ( DEBUG_MODE ) {            long endtime = System.currentTimeMillis();            if ( (endtime-starttime) > WARNNING_MAX_ELAPSED_TIME ) {                System.err.println(df.format(new java.util.Date()) +                     ":POOL:WARNNING:" + count +                    ":(" + (endtime-starttime) + "):" +                    "\t" + caller                );            }        }    }    // finalize() method will be called when JVM's GC time.    public void finalize(){        // if "conn" is not null, this means developer did not release the "conn".        if ( conn != null ) {            System.err.println(df.format(new java.util.Date()) +                 ":POOL:ERROR connection was not released:" +                used_conn_count + ":\t" + caller            );            release();        }    }}----------8><------------------------------------------------------------------NOTE: WebSphere 3.0.2.x 에서는 위에서 import 부분이 다음과 같이 되어야 한다. import com.ibm.ejs.dbm.jdbcext.*; import com.ibm.db2.jdbc.app.stdext.javax.sql.*; import javax.naming.*; import java.sql.*;반면, WebSphere 3.5.x/4.0.x 에서는 다음과 같다. //import com.ibm.ejs.dbm.jdbcext.*;   //import com.ibm.db2.jdbc.app.stdext.javax.sql.*;  import javax.sql.*; // <-- 추가 import javax.naming.*; import java.sql.*;만약, shell 상에서 직접 컴파일 할 필요가 있다면, IBM JDK 1.2 상에서는 <was_root>/lib/ujc.jar 가 CLASSPATH에 걸려 있어야 한다. javax.sql.* 패키지가 여기에 들어 있다.(통상 "bin/setenv.sh" 를 편집해서 환경변수를 잡으면 된다)위 파일을 적당한 classpath에 잡는다. system classpath에 패키지를 고려하여 잡아 주면 된다. 예를 들면, <$WAS_HOME>/classes/org/jsn/connpool/ 디렉토리에 복사한다.(<$WAS_HOME>/classes/ 디렉토리는 없을 수 있으나, 만들어 주면 되고, 해당디렉토리는 Default로 WebSphere 의 bin/admin.config 파일에서 시스템 classpath에잡혀 있다.)혹은 위 클래스를 적당한 디렉토리에 패키지에 맞게 넣어둔 후 bin/admin.config 파일에서 classpath 에 추가로 잡아주어도 된다.3.2 서블렛에서 사용방법 아래는 위의 ConnectionResource라는 Connection Adapter클래스를 이용하여 서블렛에서 사용한 예이다. ----------8><------------------------------------------------------------------ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; import org.jsn.connpool.ConnectionResource; public class YourServlet extends HttpServlet {    public void doGet (HttpServletRequest req, HttpServletResponse res)       throws ServletException, IOException    {       res.setContentType("text/plain; charset=euc-kr");       PrintWriter  out= res.getWriter();       ConnectionResource resource = null;       Connection conn = null;       Statement stmt = null;       try {         //resource = new ConnectionResource();         resource = new ConnectionResource(this); // <-- trace를 위해...         conn = resource.getConnection();         stmt = conn.createStatement();         ResultSet rs = stmt.executeQuery("select empno, ename from emp");         while(rs.next()){           out.println( rs.getString("empno") + ":" + rs.getString("ename"));         }        rs.close();      }      catch(Exception e){        out.println(e.toString());      }      finally {        if ( stmt != null ) try{stmt.close();}catch(Exception e){}        if ( conn != null ) resource.release();      }    } } ----------8><------------------------------------------------------------------3.3 JSP 에서의 사용방법JSP에서 사용하는 방법이라고해서 특별히 달라질 것은 없다. ----------8><------------------------------------------------------------------ <%@ page session="false" contentType="text/html; charset=euc-kr" %> <%@ page import="java.sql.*" %> <%@ page import="org.jsn.connpool.ConnectionResource" %> <html><body> Simple JSP File for DB Connection Testing<br> <table><tr><th>EMPNO</th><th>ENAME</th></tr> <%      ConnectionResource resource = null;      Connection conn = null;      Statement stmt = null;      try {         //resource = new ConnectionResource();         resource = new ConnectionResource(this); //<-- 로그trace를 위해...         conn = resource.getConnection();         stmt = conn.createStatement();         ResultSet rs = stmt.executeQuery("select empno, ename from emp");         while(rs.next()){ %> <tr><td><%= rs.getString("empno") %></td>     <td><%= rs.getString("ename") %></td> </tr> <%         }         rs.close();      }      //catch(Exception e){  // 에러 핸들링은 JSP엔진에서 하도록 남겨둔다.      //  out.println(e.toString());      //}      finally {  // 그러나 열려진 Connection 은 Pool에 반환되어야 한다(!)         if ( stmt != null ) try{stmt.close();}catch(Exception e){}         if ( conn != null ) resource.release();      } %> </table> </body></html> ----------8><-----------------------------------------------------------------특히나, DB Transaction 처리에는 매우 신중해야 한다. DB Transaction 처리에관련한 샘플은 언급한 "서블렛 + JDBC 연동시 코딩 고려사항 -제2탄-"의 제일 마지막부분에 소개되어 있다. 잊지 말고 다시 한번 살펴보길 바란다.서블렛 + JDBC 연동시 코딩 고려사항 -제2탄-http://javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968522077사실, 실제 프로젝트의 소스로 사용되려면, 적어도 다음 두가지 사항은 추가되어야한다.(1) 특정 구성파일(config.properties)로 부터 userid, password 등의 정보를 응용   어플리케이션 내로 가져오는 Configuration 클래스가 제공되어야 한다.   프로그램 내에 static하게 위 처럼 박아 넣는 방법은 그 어떤 이유를 들더라도   유연하지 못하며 바람직하지 않다.(단위 위 예는 Connection Adapter 클래스의   기능을 강조하기 위한 예제로 작성되었을 뿐이다.)(2) System.err.println() 혹은 System.out.println()으로 로그를 남기는 것은 극히   초보적인 발상이다. Logger.err.println(), Logger.debug.println(),   Logger.warn.println() 등과 같은 로그레벨 및 그 용법을 구분하여 사용토록하는   것이 필수적으로 필요하다. 이 사이트의 JDF(Java Development Framework)에서   그 사상 및 기법을 참고하면 되겠다.PS: 클래스 디자인을 고려하고, 프로젝트 프레임웍을 구상한 후, Entity 클래스, DB Wrapper 클래스, DBWrapperManager, TransactionManager 등을 고려하여 코딩하는 것은 이 문서의 범위를 넘어서므로 생략한다. Bean 을 만들어서 사용하거나, DB Wrapper를 이용하는 것은 이 문서의 범위를 넘어서므로 역시 생략한다.NOTE: ConnectionPreemptedException, introduced in Version 3.02, was not supportedin Version 3.5, but it was still available through Version 3.02 connection pooling.In Version 4.0, this exception no longer exists. StaleConnectionException hasreplaced ConnectionPremptedException in all cases.NOTE: The datasources.xml file has been removed in Version 4.0. The functionalityprovided through the use of this file is now part of the administrative console. For example, the statement cache size can now be set during datasource configuration on the administrative console.NOTE: 472   Connection Pooling for WebSphere V4  http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=1011034144-------------------------------------------------------    본 문서는 자유롭게 배포/복사 할 수 있으나 반드시  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다================================================  자바서비스넷 이원영  E-mail: javaservice@hanmail.net  PCS:019-310-7324================================================

Download image1.gif (30389 Bytes) image1.gif (30389 Bytes)
Download image4.gif (15265 Bytes) image4.gif (15265 Bytes)
Download image10.gif (5067 Bytes) image10.gif (5067 Bytes)
Download image12.gif (5137 Bytes) image12.gif (5137 Bytes)
Download image13.gif (2895 Bytes) image13.gif (2895 Bytes)
Download image2.gif (5294 Bytes) image2.gif (5294 Bytes)
Download image3.gif (5841 Bytes) image3.gif (5841 Bytes)
Download image8.gif (31127 Bytes) image8.gif (31127 Bytes)
Download image5.gif (5457 Bytes) image5.gif (5457 Bytes)
Download image6.gif (5242 Bytes) image6.gif (5242 Bytes)
Download image7.gif (2972 Bytes) image7.gif (2972 Bytes)
Download image9.gif (4661 Bytes) image9.gif (4661 Bytes)
Download image11.gif (5098 Bytes) image11.gif (5098 Bytes)
제목 : Re: 관련 질문/답변
글쓴이: 이원영(javaservice) 2000/10/14 00:11:27 조회수:359 줄수:37
---------> 받은 메일 내용 <----------From : "wang seok jun" <king0510@bcline.com>> 수고가 많으시네요.> 웹스피어 자료를 읽다 보니까 > >  import com.ibm.ejs.dbm.jdbcext.*;>  import com.ibm.db2.jdbc.app.stdext.javax.sql.*;>  import javax.naming.*;> 위에 있는 것들은 어디서 구해서 Import 시켜야 합니까?> 바쁘신 줄 알면서도 너무 몰라서 ....> 혹시 시간이 되시면 메일이나 전화 한번 주시면 감사하겠습니다.> mail : king0510@bcline.com> tel : 011-710-8411 왕석준>  > 웹스피어에 내장되어 있는 API들입니다.따라서 웹스피어상이라면 그대로 인식하는 API들이며, VisiualAge for Java 3.0.x Enterprise Edition 에서도 WebSphere Test Environment 기능을 추가하면 API "참조"가가능 합니다.만약, 다른 개발툴에서 개발중이거나, javac 로 직접 컴파일 하는 단계라면,(저두 정확히기억이 나질 않으나) WebSphere V3의 lib 디렉토리에서 *.jar 파일 중에 있을 것이니 잘찾아서 CLASSPATH에 등록하시면 될 것입니다.그러나 중요한 것은 WebSphere V3에 종속적인 API 이기 때문에 실행/운영은 웹스피어에서만동작합니다.================================================  자바서비스넷 이원영  E-mail: javaservice@hanmail.net  PCS:019-310-7324================================================
제목 : Re: AS400에서 DB Connection Pool Issue
글쓴이: 이원영(javaservice) 2001/03/15 21:46:23 조회수:719 줄수:87
> NT에 WebSphere3.5.2로 RS/6000의 DB2를 연결할때는 > NT의 hosts파일에 db2 ip와 호스트명을 적어주어 JDBC접속시  > > Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");> con = DriverManager.getConnection("jdbc:db2:디비명","사용자","패스워드");> 를 이용했었는데>> AS/400에서 WebSphere를 깔고 같은 DB를 사용할 때는 어떤식으로 셋팅해야하는지> 알길이 막막하군요.> JDBC드라이버인 db2java.zip파일은 AS/400의 어느 디렉토리에 넣고 was콘솔에서> JDBC드라이버설정시 어떤식으로(app혹은 net드라이버)선택해야하는지요.>> NT에서 hosts파일에 디비IP를 설정해준것처럼 AS/400의 CFGTCP에서 디비 ip를 설정하고> DB2 Net드라이브가 아닌 app드라이브로 설정하고 해보긴 했는데 잘 안되던데 > 어떻게 해줘야 하는지 좀 상세히 알려주시면 감사하겠습니다.1. 진실....>NT에 WebSphere3.5.2로 RS/6000의 DB2를 연결할때는 >NT의 hosts파일에 db2 ip와 호스트명을 적어주어 JDBC 접속시  >>Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");>con = DriverManager.getConnection("jdbc:db2:디비명","사용자","패스워드");>를 이용했었는데위는 사실이 아닙니다. "jdbc:db2:디비명"과 같은 URL 은 UDB DB2 JDBC DriverType 2 인 App Driver를 이용하여 접속한다는 것으로 의미하고,App Driver를 이용하여 원격지의 DB를 사용하려면, 첫째, Local 머신에DB2나, DB2 Client (정확히는 CAE, Oracle의 경우는 Oracle SQL*Net에 해당)가설치되어 있어야 합니다. 그러한 후, Local머신의 DB2에서 Remote 머신의DB2를 사용하기 위해 TCP/IP catalog를 해서 인식토록 해 주어야 합니다.따라서, 단지 NT의 hosts파일에 IP만 달랑 적어주어서는 안됩니다. 사실 hosts파일에 IP를 적어주는 것은 JDBC Driver와는 무관 합니다.만약, UDB DB2 JDBC Driver Type 3 Net Driver 를 이용할 경우는 Local 머신에아무것도 필요없고, 단지 db2java.zip 파일만 copy해 와서 classpath에 걸거 둔후 , DB URL을 다음처럼 기술하시면 됩니다.Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").netInstance();con = DriverManager.getConnection("jdbc:db2://192.168.0.1/디비명","사용자","패스워드");PS: 이때, Net드라이버로 접속이 되려면 DB2 에서는 "db2jstrt"    (NT에서는 "DB2 JDBC 애플릿서버") 를 기동하셔야 합니다.    (Oracle 의 listener (lsnrctl start) 와 동일한 역할이지요)2. WebSphere Connection Pool현재, WebSphere에서 제공하는 Connection Pool을 사용치 않고 있습니다.만약, 매번 직접 연결하고 끊는 구조라면, 엄청난(!) performance저하를 야기하고있을 것이며, Hans Bergstain의 DBConnectionManager.java와 같은 손수제작한 ConnectionPool을 사용하고 계시다면, 이 역시 WebSphere에서 제공하는 Connection Pool보다 성능상의 문제를 야기할 수 있습니다.WebSphere에서 Connection Pool을 사용하는 방법은 아래 문서를 참조하세요.Websphere V3 Connection Pool 사용법http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=970209527&p=54. AS400(WebSphere) --> Remote Unix DB2AS400 에서 Remote Unix머신의 DB2를 사용하는 경우는 논리적으로 생각하시면 동일합니다. 만약, Net Driver로 접근하시려면, Unix머신의 db2java.zip파일을AS400 적당한(!) 디렉토리에 넣어 두신 후, AS400의 WebSphere에서 Connection Pool사용을 위한 "JDBC Drvier설치"와 "DataSource생성"을 하시면 됩니다. 이 과정에서db2java.zip이 필요하게 됩니다.앞서의 "Websphere V3 Connection Pool 사용법"문서를 참조하십시요.만약, App Driver방식으로 연결하시려면, AS400의 DB400 DBA에게 문의하십시요.어떻게 Remote Unix쪽의 DB2를 AS400 DB 에다 tcp/ip catalog를 하는지를확인하세요.. 일단, AS400 DB에서 Remote Unix DB2를 마치 AS400 DB 인양 Access가 가능하게 되었다면, 그 다음 부터는 AS400에서 AS400 DB를 사용하는것과 동일하게 WebSphere 에서 "AS400접근용 JDBC Driver설치"와 "DataSource생성"을 통해 접근하시면 됩니다. 이 또한 위 문서에서 어떻게 하는지 세세하게 적혀있습니다.또한 아래 문서도 참조하시기 바랍니다. Re: WebSphere 3.02 AS400 ConnectionPool 사용시 http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=975900853 이원영javaservice@hanmail.net, lwy@kr.ibm.com
제목 : Re: 여러개의 DB 접근
글쓴이: 이원영(javaservice) 2001/04/02 19:48:19 조회수:294 줄수:39
>> {Re: Websphere V3 Connection Pool 사용법}> {권순효(last01), last01@hanmail.net}>> > 안녕하세요?> Websphere의 Connection Pool을 사용하였을 때 Pool관련 사항을 모니터링하는 것은 없나요..> igex에서는 jsp형태로 제공이 되던데요...> 있으면 좀 알려주세요?> > 그리고 여러개의 db에서 각각의 connection Pool을 생성하여 관리하려면 어떻게 해야하죠?>  > WebSphere 2.0.x 에서는 Connection Pool 의 상황을 보여주는 API 가 존재하였지만,WebSphere 3.0.x 이 후 부터는 더이상 관련 API를 제공하지 않습니다.여러개의 DB 접속을 위해서는 각 DB를 위한 "JDBC 드라이버"를 "생성"/"설치" 하시면서"생성" 시에 서로다른 DB URL 의 prefix 가 붙습니다.(예: jdbc:db2 ) 따라서, JDBC Driver 가 서로 다른 경우는 서로다른 "JDBC 드라이버"를 각각 생성해 주어야 하며,"DataSource"를 생성하면서 DB URL의 나머지 부분을 기술하므로, prefix 가 같고,DB명만 다르다면 "같은 JDBC드라이버"에 서로다른 "DataSource"를 여러개 만들어사용하시면 됩니다.어플리케이션 코드에서는 결국 lookup("jdbc/datasource") 를 통해 서로다른 DB를구분하게 됩니다.또한, 같은 DB에서 아이디와 패스워드가 다르다면, "같은 DataSource"를 사용하면서ds.getConnection(id,password) 와 같이 connection 을 불러올 때 구분시켜 주면됩니다.================================================  자바서비스넷 이원영  E-mail: javaservice@hanmail.net  PCS:019-310-7324================================================
제목 : Re: WebSphere - Linux 에서 Remote UDB DB2 연결
글쓴이: 이원영(javaservice) 2001/05/03 14:19:19 조회수:352 줄수:52
>---------> 받은 메일 내용 <----------> Title : 리눅스 WAS에서 win2000 DB2연결?> Date : Wed, 02 May 2001 18:38:46 KST> From : "김영수" <kimysu@hanmail.net>> To : javaservice@hanmail.net> > 현재 시스템 구성은 다음과 같습니다.>> 서버1 > OS : 레드햇리눅스 7.0> Web Server : IBMHTTPServer 1.3.12> WAS : IBM WAS 3.5(Advanced)>> >> 서버2> OS : WIN2000> WebServer : X> DB : IBM DB2>> >> 서버1(리눅스)에서는 DB를 서버2(윈도우)에 있는것을 사용할려고 합니다. 서버1에는> 인스턴스DB가 설치가 되어있고, 리눅스에서의 모든 설치는 RPM으로 했습니다.> 두서버가 윈도우환경일때는 쉽게 했었는데, 리눅스와 윈도우환경에서는 방법을 > 모르겠습니다. Remote UDB DB2 를 WebSphere 의 repository db 로 사용하는 것이 아니라, 단지응용어플리케이션에서 사용할 USER DB로 사용하는 것으로 가정하겠습니다.1. Window 2000  "서비스"에서 아래의 서비스가 기동되어 있는지 확인한다.   "DB2- DB2"   "DB2 JDBC 애플렛서버"2. Windows 2000 C:\SQLLIB\java(2?)\db2java.zip 파일을 Linux 로 copy하여 적당한    디렉토리에 복사해 둔다.3. 본글과 관련된 앞선 게시판 문서를 참조하여 Linux WebSphere 에서 Win2000 에 있는   DB2 접속을 위한 "JDBC 드라이버"와 "데이타소스"를 생성한다.   이 때, 잊어서는 안될 사항은   1) admin.config 파일의 classpath에는 db2java.zip 을 걸지않는다.   2) "JDBC드라이버"를 만들고, 오른쪽 마우스를 통해 "설치" 할 때, 위에서 copy 해 둔       db2java.zip 을 "선택" 한다.   3) 현재, linux 에는 UDB DB2 가 설치되어 있지 않으므로 DB2 App Driver 를 사용할 수 없다.      따라서 반드시 DB2 Net Driver 방식으로 설정이 되어나야 한다. 자세한 건 해당 문서에 있다.이원영
Posted by omok
,