iWiz ShareBase

IT Specialist À±ÅÂÇöÀÇ iWiz ShareBase´Â IT»Ó ¾Æ´Ï¶ó °¢Á¾ Àâ´ÙÇÑ Áö½ÄµéÀ» ÇÔ²² ³ª´©´Â Áö½Ä°øÀ¯ Ä¿¹Â´ÏƼÀÔ´Ï´Ù.

iWiz,ShareBase,À±ÅÂÇö,Java,JSP,EJB,IT,Á¤º¸±â¼ú,À¥ÇÁ·Î±×·¡¹Ö,PHP,ASP,DBMS,MySQL,¼­¹ö,³×Æ®¿öÅ©,server,network,WAS,À¥¾ÖÇø®ÄÉÀ̼Ç,ºí·Î±×,blog,À¥¼­¹ö,DB,¿À¶óŬ,oracle,mysql,JRun,À¥·ÎÁ÷,ÅèĹ,tomcat,¾ÆÆÄÄ¡,ÀÚµ¿Â÷,EF½î³ªÅ¸,·Î¶Ç 6/45

°¶·¯¸® Pixelgrapher.com | ·Î¶Ç 6/45 ¹øÈ£»ý¼º ¹× Åë°è µ¥ÀÌÅÍ | Àüü±â»çº¸±â | Àüü±Û #1 | Àüü±Û #2 | Àüü±Û #3 | Àüü±Û #4 | Àüü±Û #5 | Àüü±Û #6 | Àüü±Û #7 | Àüü±Û #8 | Àüü±Û #9 | Àüü±Û #10 |
HOME iWiz
ShareBase
Remember 0523 & 0818
Áö½ÄÀº ³ª´­¼ö·Ï Ä¿Áý´Ï´Ù - iWiz's ShareBase
À¥ÇÁ·Î±×·¡¹Ö(±âŸ) PHP, ASP, Perl, CGI µî °¢Á¾ À¥ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ÀÚ·áµéÀÔ´Ï´Ù.


  iWiz(2004-01-04 22:40:55, Hit : 5936, Vote : 40
 http://www.wz.pe.kr

¼­ºí¸´ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× 2


¼­ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× -Á¦2ź-
[JDBC Connection Pooling]

ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.01.19
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.03.20(»ùÇÿ¹Á¦Ãß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.10.22(µð¹ö±ëÀ» À§ÇÑ ·ÎÁ÷Ãß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.10.29(Oracle JDBC2.0 »ùÇÃÃß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.11.08(À±ÇѼº´Ô µµ¿ò OracleConnectionCacheImpl ¼Ò½º¼öÁ¤)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.11.09(Trace/DebuggingÀ» À§ÇÑ Àå¹®ÀÇ »çÁ·À» ´ã)

5. JDBC Connection Pooling À» ¿Ö »ç¿ëÇØ¾ß Çϴ°¡ ?

Pooling À̶õ ¿ë¾î´Â ÀϹÝÀûÀÎ ¿ë¾îÀÔ´Ï´Ù. Socket Connection Pooling, Thread
Pooling, Resource Pooling µî "¾î¶² ÀÚ¿øÀ» ¹Ì¸® Pool ¿¡ ÁغñÇØµÎ°í ¿äû½Ã Pool¿¡
ÀÖ´Â ÀÚ¿øÀ» °ð¹Ù·Î ²¨³»¾î Á¦°øÇÏ´Â ±â´É"ÀÎ °ÅÁÒ.

JDBC Connection Pooling Àº JDBC¸¦ ÀÌ¿ëÇÏ¿© ÀÚ¹Ù¿¡¼­ DB¿¬°áÀ» ÇÒ ¶§, ¹Ì¸® Pool¿¡
¹°¸®ÀûÀÎ DB ¿¬°áÀ» ÀÏÁ¤°³¼ö À¯ÁöÇÏ¿© µÎ¾ú´Ù°¡ ¾îÇø®ÄÉÀ̼ǿ¡¼­ ¿ä±¸ÇÒ ¶§ °ð¹Ù·Î
Á¦°øÇØÁÖ´Â ±â´ÉÀ» ÀÏÄ´ ¿ë¾îÀÔ´Ï´Ù. JDBC ¿¬°á½Ã¿¡, (DB Á¾·ù¸¶´Ù, ±×¸®°í JDBC
DriverÀÇ Å¸ÀÔ¿¡ µû¶ó ¾à°£¾¿ ´Ù¸£±ä ÇÏÁö¸¸ ) ´ë·« 200-400 ms °¡ ¼Ò¿ä µË´Ï´Ù. ±â²¯
0.2 ÃÊ 0.4 ÃÊ ¹Û¿¡ ¾ÈµÇ´Â µ¥ ¹«½¼ ¹®Á¦³Ä ¶ó°í ¹Ý¹®ÇÒ¼öµµ ÀÖ½À´Ï´Ù.

ÇÏÁö¸¸, À§ ½Ã°£Àº ÇϳªÀÇ ¿¬°áÀ» ½ÃµµÇÒ ¶§ ±×·¯ÇÏ°í, 100 - 200°³¸¦ µ¿½Ã¿¡ ¿¬°áÀ»
½ÃµµÇÏ¸é ¾ê±â°¡ ¿ÏÀüÈ÷ ´Þ¶óÁý´Ï´Ù.

¾Æ·¡´Â Á÷Á¢ JDBC µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ¿© ¿¬°áÇÒ ¶§¿Í JDBC Connection Pooling À» »ç¿ë
ÇÒ ¶§ÀÇ ¼º´É ºñ±³ °á°úÀÔ´Ï´Ù.


------------------------------------------------------------------
Å×½ºÆ® ȯ°æ
LG-IBM 570E Notebook(CPU:???MHz , MEM:320MB)
Windows NT 4.0 Service Pack 6
IBM WebSphere 3.0.2.1 + e-Fixes
IBM HTTP Server 1.3.6.2
IBM UDB DB2 6.1

¾Æ·¡¿¡ ÷ºÎÇÑ ÆÄÀÏ´Â ÀڷḦ ¸¸µé¶§ »ç¿ëÇÑ JSP¼Ò½ºÀÔ´Ï´Ù. (÷ºÎÆÄÀÏÂüÁ¶)

[HttpConn.java] °£´ÜÇÑ Stress Test ÇÁ·Î±×·¥


¾Æ·¡ÀÇ ¼öÄ¡´Â ÀÌ ¹®¼­ ÀÌ¿Ü¿¡´Â ´Ù¸¥ ¿ëµµ·Î »ç¿ëÇÏ½Ã¸é ¾ÈµË´Ï´Ù. Å×½ºÆ®¸¦ ÀúÀÇ
°³ÀÎ ³ëÆ®ºÏ¿¡¼­ ÃøÁ¤ÇÑ °ÍÀÌ°í, ¶ÇÇÑ Å×½ºÆ® ÇÁ·Î±×·¥ ¿ª½Ã Á÷Á¢ ¸¸µé¾îÇÑ °ÍÀÎ
¸¸Å­, °øÁ¤¼ºÀ̳ª ¼öÄ¡¿¡ ´ëÇÑ ½Å·Ú¸¦ ºÎ¿©ÇÒ ¼ö´Â ¾ø½À´Ï´Ù.
±×·¯³ª JDBC Connection Pooling Àû¿ë ¿©ºÎ¿¡ µû¸¥ »ó´ëÀûÀÎ Â÷À̸¦ ¼³¸íÇϱ⿡´Â
ÃæºÐÇÒ °Í °°½À´Ï´Ù.

Å×½ºÆ® °á°ú

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
¸Å¹ø Á÷Á¢ JDBC Driver ¿¬°áÇÏ´Â °æ¿ì
java HttpConn http://localhost/db_jdbc.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0

TOTAL( 1,10)  iteration=10 ,  average=249.40 (ms),   TPS=3.93
TOTAL(50,10)  iteration=500 , average=9,149.84 (ms), TPS=4.83
TOTAL(100,10)  iteration=1000 , average=17,550.76 (ms), TPS=5.27
TOTAL(200,10)  iteration=2000 , average=38,479.03 (ms), TPS=4.89
TOTAL(300,10)  iteration=3000 , average=56,601.89 (ms), TPS=5.01

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DB Connection Pooing À» »ç¿ëÇÏ´Â °æ¿ì
java HttpConn http://localhost/db_pool_cache.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0

TOTAL(1,10)  iteration=10 , average=39.00 (ms), TPS=23.26
TOTAL(1,10)  iteration=10 , average=37.10 (ms), TPS=24.33
TOTAL(50,10)  iteration=500 , average=767.36 (ms), TPS=45.27
TOTAL(50,10)  iteration=500 , average=568.76 (ms), TPS=61.26
TOTAL(50,10)  iteration=500 , average=586.51 (ms), TPS=59.79
TOTAL(50,10)  iteration=500 , average=463.78 (ms), TPS=67.02
TOTAL(100,10)  iteration=1000 , average=1,250.07 (ms), TPS=57.32
TOTAL(100,10)  iteration=1000 , average=1,022.75 (ms), TPS=61.22
TOTAL(200,10)  iteration=1462 , average=1,875.68 (ms), TPS=61.99
TOTAL(300,10)  iteration=1824 , average=2,345.42 (ms), TPS=61.51

NOTE: average:Æò±Õ¼öÇà½Ã°£, TPS:ÃÊ´ç 󸮰Ǽö
------------------------------------------------------------------

Áï, JDBC Driver ¸¦ ÀÌ¿ëÇÏ¿© Á÷Á¢ DB¿¬°áÀ» ÇÏ´Â ±¸Á¶´Â ±â²¯ 1ÃÊ¿¡ 5°³ÀÇ ¿äûÀ»
ó¸®ÇÒ ¼ö ÀÖ´Â ´É·ÂÀÌ ÀÖ´Â ¹Ý¸é, DB Connection Pooling À» »ç¿ëÇÒ °æ¿ì´Â ÃÊ´ç
60¿©°³ÀÇ ¿äûÀ» ó¸®ÇÒ ¼ö ÀÖ´Â °ÍÀ¸·Î ³ªÅ¸³µ½À´Ï´Ù.
12¹èÀÇ ¼º´ÉÇâ»óÀ» °¡Á®¿Â°ÅÁÒ. (ÀÌ ¼öÄ¡´Â H/W±âÁ¾°ú ÃøÁ¤¹æ¹ý, ±×¸®°í ¾îÇø®ÄÉÀ̼ǿ¡
µû¶ó ´Ù¸£°Ô ³ª¿À´Ï ÀÌ ¼öÄ¡ÀÚü¿¡ ³Ê¹« Å« Àǹ̸¦ µÎÁø ¸¶¼¼¿ä)


ÁÖÀÇ: ÈçÈ÷ "¼º´É(Performance)"À» ³ªÅ¸³¾ ¶§, ÀÀ´ä½Ã°£À» °¡Áö°í ¾ê±âÇÏ´Â °æÇâÀÌ
  ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÀ´ä½Ã°£À̶ó´Â °ÍÀº ActiveUser¼ö°¡ Áõ°¡ÇÏ¸é ´ç¿¬È÷ ±×¿¡ µû¶ó
  ´À·ÁÁö°Ô µË´Ï´Ù. ¹Ý¸é "´ÜÀ§½Ã°£´ç 󸮰Ǽö"ÀÎ TPS(Transaction Per Second) ȤÀº
  RPS(Request Per Second)´Â ActiveUser¸¦ Áö¼ÓÀûÀ¸·Î ²ø¾î¿Ã·Á ÀÓ°èÁ¡À» ³Ñ¾î¼­¸é,
  Æ¯Á¤¼öÄ¡ ÀÌ»óÀ» ¿Ã¶ó°¡Áö ¾Ê½À´Ï´Ù. µû¶ó¼­ ¼º´ÉÀ» ¾ê±âÇÒ ¶© Æò±ÕÀÀ´ä½Ã°£ÀÌ ¾Æ´Ï¶ó
  "´ÜÀ§½Ã°£´ç ÃÖ´ë󸮰Ǽö"¸¦ À̾߱â ÇÏ¼Å¾ß ÇÕ´Ï´Ù.
  ¼º´É(Performance)ÀÇ Á¤ÀÇ(Definition)Àº "´ÜÀ§½Ã°£´ç ÃÖ´ë󸮰Ǽö"ÀÓÀ» ÁÖÁöÇϼ¼¿ä.
  ¼º´É¿¡ °ü·ÃÇÑ ÀÌ·ÐÀº ¾Æ·¡ÀÇ ¹®¼­¸¦ ÅëÇØ, ÇÔ²² ¿¬±¸ÇϽÃÁö¿ä.
  [°­ÁÂ]À¥±â¹Ý½Ã½ºÅÛÇÏ¿¡¼­ÀÇ ¼º´É¿¡ ´ëÇÑ ÀÌ·ÐÀû °íÂû
  http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=consult&c=r_p&n=1008701211

PS: IBM WebSphere V3 ÀÇ °æ¿ì, Connection À» °¡Á®¿Ã ¶§, JNDI¸¦ »ç¿ëÇÏ°Ô µÇ´Âµ¥
   À̶§ »ç¿ëµÇ´Â DataSource °´Ã¼¸¦ ¸Å¹ø initialContext.lookup() À» ÅëÇØ °¡Á®¿À°Ô
   µÇ¸é, ±Þ°ÝÇÑ ¼º´ÉÀúÇÏ°¡ ÀϾ´Ï´Ù.(NOTE: V4ºÎÅÍ´Â ³»ºÎÀûÀ¸·Î cache¸¦ »ç¿ëÇÏ¿©
   ¼º´ÉÀÌ º¸´Ù Çâ»óµÇ¾ú½À´Ï´Ù)
   DataSource¸¦ ¸Å ¿äû½Ã¸¶´Ù lookup ÇÒ °æ¿ì ´ÙÀ½°ú °°Àº °á°ú¸¦ °¡Á®¿Ô½À´Ï´Ù.

   java HttpConn http://localhost/db_pool.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0

   TOTAL(1,10)  iteration=10 , average=80.00 (ms), TPS=11.61
   TOTAL(50,10)  iteration=500 , average=2,468.30 (ms), TPS=16.98
   TOTAL(50,10)  iteration=500 , average=2,010.43 (ms), TPS=18.18
   TOTAL(100,10)  iteration=1000 , average=4,377.24 (ms), TPS=18.16
   TOTAL(200,10)  iteration=1937 , average=8,991.89 (ms), TPS=18.12

   TPS °¡ 18 À̴ϱî DataSource Cache ¸¦ »ç¿ëÇÒ ¶§ º¸´Ù 1/3 ¼º´É¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â °ÅÁÒ.



6. JDBC Connection Pooling À» »ç¿ëÇÏ¿© ÄÚµùÇÒ ¶§ °í·Á»çÇ×

JDBC Connecting PoolingÀº JDBC 1.0 ½ºÆå»ó¿¡ ¾ð±ÞµÇ¾î ÀÖÁö ¾Ê¾Ò½À´Ï´Ù. ±×·¯´Ùº¸´Ï
BEA WebLogic, IBM WebSphere, Oracle OAS, Inprise Server, Sun iPlanet µî ¾îÇø®ÄÉ
ÀÌ¼Ç ¼­¹ö¶ó°í ºÒ¸®´Â Á¦Ç°µé¸¶´Ù ±× ±¸Çö¹æ½ÄÀÌ ´Þ¶ú½À´Ï´Ù.
ÀÎÅͳݿ¡¼­ µ¹¾Æ´Ù´Ï´Â Hans Bergsten ÀÌ ¸¸µç DBConnectionManager.java µµ ±×·¸°í,
JDF ¿¡ Æ÷ÇԵǾî ÀÖ´Â ÆÐÅ°Áöµµ ±×·¸°í °¢ÀÚ µ¶Æ¯ÇÑ ¹æ½ÄÀ¸·Î °³¹ßÀÌ µÇ¾î ÀÖ½À´Ï´Ù.

JDBC¸¦ ÀÌ¿ëÇÏ¿© DB¿¬°áÇÏ´Â ´ëÇ¥ÀûÀÎ ÄÚµù ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.

------------------------------------------------------------------
[BEA WebLogic Application Server]

    import java.sql.*;

    // Driver loading needed.
    static {
      try {
        Class.forName("weblogic.jdbc.pool.Driver").newInstance();          
      }
      catch (Exception e) {
        ...
      }
    }

    ......

    Connection conn = null;
    Statement stmt = null;
    try {
      conn = DriverManager.getConnection("jdbc:weblogic:pool:<pool_name>", null);
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( conn != null ) try{conn.close();}catch(Exception e){}
    }


------------------------------------------------------------------
IBM WebSphere Application Server 3.0.2.x / 3.5.x

    /* IBM WebSphere 3.0.2.x for JDK 1.1.8 */
    //import java.sql.*;
    //import javax.naming.*;
    //import com.ibm.ejs.dbm.jdbcext.*;
    //import com.ibm.db2.jdbc.app.stdext.javax.sql.*;

    /* IBM WebSphere 3.5.x for JDK 1.2.2 */
    import java.sql.*;
    import javax.sql.*;
    import javax.naming.*;

    // DataSource Cache »ç¿ëÀ» À§ÇÑ ds °´Ã¼ static ÃʱâÈ­
    private static DataSource ds = null;
    static {
      try {
        java.util.Hashtable props = new java.util.Hashtable();
        props.put(Context.INITIAL_CONTEXT_FACTORY,
                  "com.ibm.ejs.ns.jndi.CNInitialContextFactory");
        Context ctx = null;
        try {
          ctx = new InitialContext(props);
          ds = (DataSource)ctx.lookup("jdbc/<data_source_name>");
        }
        finally {
          if ( ctx != null ) ctx.close();
        }
      }
      catch (Exception e) {
       ....
      }
    }

    .....  

    Connection conn = null;
    Statement stmt = null;
    try {
      conn = ds.getConnection("userid", "password");
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( conn != null ) try{conn.close();}catch(Exception e){}
    }

------------------------------------------------------------------
IBM WebSphere Application Server 2.0.x
  
    import java.sql.*;
    import com.ibm.servlet.connmgr.*;


    // ConnMgr Cache »ç¿ëÀ» À§ÇÑ connMgr °´Ã¼ static ÃʱâÈ­

    private static IBMConnMgr connMgr = null;
    private static IBMConnSpec        spec = null;
    static {
      try {
        String poolName = "JdbcDb2";  // defined in WebSphere Admin Console
        spec = new IBMJdbcConnSpec(poolName, false,  
              "com.ibm.db2.jdbc.app.DB2Driver",
              "jdbc:db2:<db_name>",   // "jdbc:db2://ip_address:6789/<db_name>",
              "userid","password");                                        
        connMgr = IBMConnMgrUtil.getIBMConnMgr();
      }
      catch(Exception e){
        .....
      }
    }

    .....

    IBMJdbcConn cmConn = null; // "cm" maybe stands for Connection Manager.
    Statement stmt = null;
    try {
      cmConn = (IBMJdbcConn)connMgr.getIBMConnection(spec);    
      Connection conn = jdbcConn.getJdbcConnection();
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( cmConn != null ) try{cmConn.releaseIBMConnection();}catch(Exception e){}
    }
    // NOTE: DO NOT "conn.close();" !!


------------------------------------------------------------------
Oracle OSDK(Oracle Servlet Development Kit)

    import java.sql.*;
    import oracle.ec.ctx.*;


    .....
    
    oracle.ec.ctx.Trx trx = null;
    Connection conn = null;
    Statement stmt = null;
    try {
      oracle.ec.ctx.TrxCtx ctx = oracle.ec.ctx.TrxCtx.getTrxCtx();
      trx = ctx.getTrx();
      conn = trx.getConnection("<pool_name>");
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( conn != null ) try{ trx.close(conn,"<pool_name>");}catch(Exception e){}
    }
    // NOTE: DO NOT "conn.close();" !!


------------------------------------------------------------------
Hans Bergsten ÀÇ DBConnectionManager.java

    import java.sql.*;

    .....
    
    db.DBConnectionManager connMgr = null;
    Connection conn = null;
    Statement stmt = null;
    try {
      connMgr = db.DBConnectionManager.getInstance();
      conn = connMgr.getConnection("<pool_name>");
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( conn != null ) connMgr.freeConnection("<pool_name>", conn);
    }
    // NOTE: DO NOT "conn.close();" !!

------------------------------------------------------------------
JDF ÀÇ DB Connection Pool Framework

    import java.sql.*;
    import com.lgeds.jdf.*;
    import com.lgeds.jdf.db.*;
    import com.lgeds.jdf.db.pool.*;


    private static com.lgeds.jdf.db.pool.JdbcConnSpec spec = null;
    static {
      try {
        com.lgeds.jdf.Config conf = new com.lgeds.jdf.Configuration();
        spec =  new com.lgeds.jdf.db.pool.JdbcConnSpec(
             conf.get("gov.mpb.pbf.db.emp.driver"),
             conf.get("gov.mpb.pbf.db.emp.url"),
             conf.get("gov.mpb.pbf.db.emp.user"),
             conf.get("gov.mpb.pbf.db.emp.password")
          );
      }
      catch(Exception e){
        .....
      }
    }

    .....

    PoolConnection poolConn = null;
    Statement stmt = null;
    try {
      ConnMgr mgr = ConnMgrUtil.getConnMgr();
      poolConn = mgr.getPoolConnection(spec);
      Connection conn = poolConnection.getConnection();
      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( poolConn != null ) poolConn.release();
    }
    // NOTE: DO NOT "conn.close();" !!

------------------------------------------------------------------


¿©±â¼­ ÇÏ°íÇ ¾ê±â´Â DB Connection Pool À» ±¸ÇöÇÏ´Â ¹æ½Ä¿¡ µû¶ó¼­ °³¹ßÀÚÀÇ ¼Ò½ºµµ
ÀüºÎ Á¦ °¢±â ´Ù¸¥ API¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
ÇÁ·ÎÁ§Æ®¸¦ ÀÌ°÷ Àú°÷ ¶Ù¾î º» ºÐÀº ¾Æ½Ã°ÚÁö¸¸, ¸Å ÇÁ·ÎÁ§Æ®¸¶³ª ¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡
´Ù¸£°í Áö³­ ÇÁ·ÎÁ§Æ®¿¡¼­ »ç¿ëµÈ ¼Ò½º¸¦ »õ ÇÁ·ÎÁ§Æ®¿¡ ±×´ë·Î Àû¿ëÇÏÁö ¸øÇÏ°Ô µË´Ï´Ù.
JDBC °ü·Ã API°¡ ´Ù¸£±â ¶§¹®ÀÌÁÒ.
°°Àº Á¦Ç°ÀÏÁö¶óµµ ¹öÀü¾÷ÀÌ µÇ¸é¼­ API°¡ º¯Çعö¸®´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é,
IBM WebSphere ¹öÀü 2.0.x¿¡¼­ ¹öÀü 3.0.x·ÎÀÇ ÀüȯÇÒ ¶§, DB ¿¬°áÀ» À§ÇÑ API°¡
º¯Çعö·Á ±âÁ¸¿¡ °³¹ßÇصР400 ¿©°³ÀÇ ¼Ò½º¸¦ ´Ù ¶â¾î °íÃÄ¾ß ÇÏ´Â °Í°ú °°Àº »óȲÀÌ
¹ú¾îÁú ¼öµµ ÀÖ½À´Ï´Ù.
´åÄľ÷ü¿¡¼­ ƯÁ¤ ÆÐÅ°Áö Á¦Ç°À» ¸¸µé¶§µµ ¸¶Âù°¡Áö ÀÔ´Ï´Ù. ÀÚ»çÀÇ Á¦Ç°ÀÌ ¾î¶°ÇÑ
¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡¼­ µ¿ÀÛÇϵµ·Ï ÇØ¾ß ÇÏ´À³Ä¿¡ µû¶ó ÄÚµùÇÒ API°¡ ´Þ¶óÁö´Ï ¼Ò½º¸¦
¸Å¹ø º¯°æÇؾ߸¸ ÇÏ°Ú°í, ƯÁ¤ ¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡¸¸ µ¿ÀÛÇÏ°Ô ÇÏ·Á´Ï ¸¶ÄϽÃÀåÀÌ
Á¼¾ÆÁö°Ô µË´Ï´Ù.
IBM WebSphere, BEA WebLogic »Ó¸¸ ¾Æ´Ï¶ó Apache JServ ³ª JRun, ȤÀº Tomcat ¿¡¼­µµ
½±°Ô Æ÷ÆÃÇÏ±æ ¿øÇÒ °ÍÀÔ´Ï´Ù.

ÀÌ°ÍÀ» ÇØ°áÇÏ´Â ¹æ¹ýÀº ¿ì¸®µé "SE(System Engineer)"¸¸ÀÇ °íÀ¯ÇÑ "Connection Adapter
Ŭ·¡½º"¸¦ ¸¸µé¾î¼­ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

¿¹¸¦ µé¾î °³¹ßÀÚÀÇ ¼Ò½º´Â ÀÌÁ¦ Ç×»ó ´ÙÀ½°ú °°Àº À¯ÇüÀ¸·Î ÄÚµùµÇ¸é ¾î¶»°Ú½À´Ï±î ?


    -----------------------------------------------------------
    .....
    ConnectionResource resource = null;
    Statement stmt = null;
    try {
      resource = new ConnectionResource();
      Connection conn = resource.getConnection();

      stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select ....");
      while(rs.next()){
        .....
      }
      rs.close();
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( resource != null ) resource.release();
    }
    // NOTE: DO NOT "conn.close();" !!
    -----------------------------------------------------------



ÀÌ ¶§ ConnectionResource ´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ´©±º°¡ ÇѺÐÀÌ ¸¸µé¾î µÎ¸é µÇ°ÚÁÒ.

    -----------------------------------------------------------
    import java.sql.*;
    public class ConnectionResource
    {
      private java.sql.Connection conn = null;
      public ConnectionResource() throws Exception {
         ......
         conn =  ..... GET Connection by Connection Pooling API
      }
      public Connection getConnection() throws Exception {
         return conn;
      }
      public void release(){
         // release conn into "Connection Pool"
         .......
      }
    }
    -----------------------------------------------------------



  ¿¹¸¦ µé¾î IBM WebSphere Version 3.0.2.x ÀÇ °æ¿ì¸¦ µç´Ù¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.

  -----------------------------------------------------------
  package org.jsn.connpool;
  /*
   * ConnectionResource V 1.0
   * JDBC Connection Pool Adapter for IBM WebSphere V 3.0.x/3.5.x
   * Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
   * Last Modified : 2000.11.10
   * NOTICS: You can re-distribute or copy this source code freely,
   *         you can NOT remove the above subscriptions.
  */

  /* IBM WebSphere 3.0.2.x for JDK 1.1.8 */
  //import java.sql.*;
  //import javax.naming.*;
  //import com.ibm.ejs.dbm.jdbcext.*;
  //import com.ibm.db2.jdbc.app.stdext.javax.sql.*;

  /* IBM WebSphere 3.5.x for JDK 1.2.2 */
  import java.sql.*;
  import javax.sql.*;
  import javax.naming.*;

  public class ConnectionResource
  {
     private static final String userid = "userid";
     private static final String password = "password"
     private static final String datasource = "jdbc/<data_source_name>";
     private static DataSource ds = null;

     private java.sql.Connection conn = null;

     public ConnectionResource() throws Exception {
       synchronized ( ConnectionResource.class ) {
         if ( ds == null ) {
           java.util.Hashtable props = new java.util.Hashtable();
           props.put(Context.INITIAL_CONTEXT_FACTORY,
              "com.ibm.ejs.ns.jndi.CNInitialContextFactory");
           Context ctx = null;
           try {
             ctx = new InitialContext(props);
             ds = (DataSource)ctx.lookup("jdbc/<data_source_name>");
           }
           finally {
             if ( ctx != null ) ctx.close();
           }
         }
       }
       conn =  ds.getConnection( userid, password );
     }
     public Connection getConnection() throws Exception {
        if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
        return conn;
     }
     public void release(){
        // release conn into "Connection Pool"
        if ( conn != null ) try { conn.close(); }catch(Excepton e){}
        conn = null;
     }
   }
   -----------------------------------------------------------
          


  
  ¸¸¾à Hans Bersten ÀÇ DBConnectionManager.java ¸¦ ÀÌ¿ëÇÑ Connection Pool À̶ó¸é
  ´ÙÀ½°ú °°ÀÌ ¸¸µé¾î ÁÖ¸é µË´Ï´Ù.

   -----------------------------------------------------------
   package org.jsn.connpool;
   import java.sql.*;
   public class ConnectionResource
   {
      private String poolname = "<pool_name>";
      private Connection conn = null;
      private db.DBConnectionManager connMgr = null;

      public ConnectionResource() throws Exception {
         connMgr = db.DBConnectionManager.getInstance();
         conn =  connMgr.getConnection(poolname);
      }
      public Connection getConnection() throws Exception {
         if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
         return conn;
      }
      public void release(){
         if ( conn != null ) {
           // Dirty TransactionÀ» rollback½ÃÅ°´Â ºÎºÐÀε¥, »ý·«Çϼŵµ µË´Ï´Ù.
           boolean autoCommit = true;
           try{ autoCommit = conn.getAutoCommit(); }catch(Exception e){}
           if ( autoCommit == false ) {
             try { conn.rollback(); }catch(Exception e){}
             try { conn.setAutoCommit(true); }catch(Exception e){}
           }

           connMgr.freeConnection(poolname, conn);
           conn = null;
         }
      }
   }
   -----------------------------------------------------------


  ¶Ç, Resin 1.2.x ÀÇ °æ¿ì¶ó¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.
  -----------------------------------------------------------
  package org.jsn.connpool;
  /*
   * ConnectionResource V 1.0
   * JDBC Connection Pool Adapter for Resin 1.2.x
   * Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
   * Last Modified : 2000.10.18
   * NOTICS: You can re-distribute or copy this source code freely,
   *         you can NOT remove the above subscriptions.
  */
  import java.sql.*;
  import javax.sql.*;
  import javax.naming.*;
  public class ConnectionResource
  {
     private static final String datasource = "jdbc/<data_source_name>";
     private static final String userid = "userid";
     private static final String password = "password"
     private static DataSource ds = null;

     private java.sql.Connection conn = null;

     public ConnectionResource() throws Exception {
        synchronized ( ConnectionResource.class ) {
          if ( ds == null ) {
            Context env = (Context) new InitialContext().lookup("java:comp/env");
            ds = (DataSource) env.lookup(datasource);
          }
        }    
        conn =  ds.getConnection( userid, password );
     }
     public Connection getConnection() throws Exception {
        if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
        return conn;
     }
     public void release(){
        // release conn into "Connection Pool"
        if ( conn != null ) try { conn.close(); }catch(Excepton e){}
        conn = null;
     }
   }
   -----------------------------------------------------------


  Oracle 8i(8.1.6ÀÌ»ó)¿¡¼­ OracleÀÇ JDBC 2.0 Driver ÀÚü°¡ Á¦°øÇÏ´Â Connection
  PoolÀ» ÀÌ¿ëÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.
  -----------------------------------------------------------
  package org.jsn.connpool;
  /*
   * ConnectionResource V 1.0
   * JDBC Connection Pool Adapter for Oracle JDBC 2.0
   * Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
   * Last Modified : 2001.10.29
   * NOTICS: You can re-distribute or copy this source code freely,
   *         but you can NOT remove the above subscriptions.
  */
  import java.sql.*;
  import javax.sql.*;
  import oracle.jdbc.driver.*;
  import oracle.jdbc.pool.*;

  public class ConnectionResource
  {
     private static final String dbUrl = "jdbc:oracle:thin@192.168.0.1:1521:ORCL";
     private static final String userid = "userid";
     private static final String password = "password"
     private static OracleConnectionCacheImpl oraclePool = null;
     private static boolean initialized = false;

     private java.sql.Connection conn = null;

     public ConnectionResource() throws Exception {
        synchronized ( ConnectionResource.class ) {
          if ( initialized == false ) {
            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
            oraclePool = new OracleConnectionCacheImpl();
            oraclePool.setURL(dbUrl);
            oraclePool.setUser(userid);
            oraclePool.setPassword(password);
            oraclePool.setMinLimit(10);
            oraclePool.setMaxLimit(50);
            //oraclePool.setCacheScheme(OracleConnectionCacheImpl.FIXED_WAIT_SCHEME);
            // FIXED_WAIT_SCHEME(default), DYNAMIC_SCHEME, FIXED_RETURN_NULL_SCHEME
            //oraclePool.setStmtCacheSize(0); //default is 0

            initialized = true;
          }
        }    
        conn = oraclePool.getConnection();
     }
     public Connection getConnection() throws Exception {
        if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
        return conn;
     }
     public void release(){
        // release conn into "Connection Pool"
        if ( conn != null ) try { conn.close(); }catch(Exception e){}
        conn = null;
     }
   }
   -----------------------------------------------------------

  ¶ÇÇÑ ¼³·É Connection Pool ±â´ÉÀ» Áö±ÝÀ» »ç¿ëÄ¡ ¾Ê´õ¶óµµ ÇâÈÄ¿¡ Àû¿ëÇÒ °èȹÀÌ
  ÀÖ´Ù¸é, ¿ì¼±Àº ´ÙÀ½°ú °°Àº Connection Adapter Ŭ·¡½º¸¦ ¹Ì¸® ¸¸µé¾î µÎ°í À̸¦
  »ç¿ëÇÏ´Â °ÍÀÌ È¿°úÀûÀÔ´Ï´Ù. ÇâÈÄ¿¡ ÀÌ Å¬·¡½º¸¸ °íÃÄÁÖ¸é µÇ´Ï±î¿ä.
  Oracle Thin Driver¸¦ »ç¿ëÇÏ´Â °æ¿ìÀÔ´Ï´Ù.

  -----------------------------------------------------------
  import java.sql.*;
  public class ConnectionResource
  {
     private static final String userid = "userid";
     private static final String password = "password"
     private static final String driver = "oracle.jdbc.driver.OracleDriver"
     private static final String url = "jdbc:oracle:thin@192.168.0.1:1521:ORCL";
     private static boolean initialized = false;

     private java.sql.Connection conn = null;

     public ConnectionResource() throws Exception {
        synchronized ( ConnectionResource.class ) {
          if ( initialized == false ) {
              Class.forName(driver);
              initialized = true;
          }
        }
        conn = DriverManager.getConnection( url, userid, password );
     }
     public Connection getConnection() throws Exception {
        if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
        return conn;
     }
     public void release(){
        if ( conn != null ) try { conn.close(); }catch(Excepton e){}
        conn = null;
     }
   }
   -----------------------------------------------------------


ÇÁ·Î±×·¥ÀÇ À¯ÇüÀ̳ª, Ŭ·¡½º À̸§ÀÌ¾ß ¹¹µç »ó°ü¾ø½À´Ï´Ù. À§Ã³·³ ¿ì¸®µé¸¸ÀÇ °íÀ¯ÇÑ
"Connection Adapter Ŭ·¡½º"¸¦ ¸¸µé¾î¼­ »ç¿ëÇÑ´Ù´Â °ÍÀÌ Áß¿äÇÏ°í, ¸¸¾à ¾îÇø®ÄÉÀ̼Ç
¼­¹ö°¡ º¯°æµÈ´Ù°Å³ª, DB Connection Pooling ¹æ½ÄÀÌ ´Þ¶óÁö¸é ÇØ´ç ConnectionResource
Ŭ·¡½º ³»¿ë¸¸ »ì¦ °íÃÄÁÖ¸é °³¹ßÀÚÀÇ ¼Ò½º´Â ÀüÇô °íÄ¡Áö ¾Ê¾Æµµ µÉ °ÍÀÔ´Ï´Ù.

NOTE: ConnectionResource Ŭ·¡½º¸¦ ¸¸µé¶§ ÁÖÀÇÇÒ °ÍÀº Àý´ë Exception À» Ŭ·¡½º ³»ºÎ¿¡¼­
   °¡·Îä¾î ¹«½ÃÇÏ°Ô ÇÏÁö ¸»¶ó´Â °ÍÀÔ´Ï´Ù. ±×³É ±×´ë·Î throw °¡ ÀϾ°Ô ±¸ÇöÇϼ¼¿ä.
   ÀÌ·¸°Ô Çϼž߸¸ °³¹ßÀÚÀÇ ¼Ò½º¿¡¼­ "Exception ó¸®"¸¦ ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.

NOTE2: ConnectionResource Ŭ·¡½º¸¦ ¸¸µé¶§ ¹Ýµå½Ã package ¸¦ ¼±¾ðÇϵµ·Ï Çϼ¼¿ä.
   IBM WebSphere 3.0.x ÀÇ °æ¿ì JSP¿¡¼­ "¼­ºí·¿Å¬·¡½ºÆнº"¿¡ °É·Á Àִ Ŭ·¡½º¸¦
   ÂüÁ¶ÇÒ ¶§, ±× Ŭ·¡½º°¡ default package Áï package °¡ ¾ø´Â Ŭ·¡½ºÀÏ °æ¿ì ÂüÁ¶ÇÏÁö
   ¸øÇÏ´Â ¹ö±×°¡ ÀÖ½À´Ï´Ù. Åë»ó "Bean"À̶ó ºÒ¸®´Â Ŭ·¡½º ¿ª½Ã Á¶°Ç¿¡ µû¶ó ÀνÄÇÏÁö
   ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.
   Ŭ·¡½º ´ÙÁöÀÎ ¹× ¼³°è »óÀ¸·Î º¸´õ¶óµµ package ¸¦ ¼±¾ðÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù.

NOTE3: À§¿¡¼­  "userid", "password" µî°ú °°ÀÌ ¸í½ÃÀûÀ¸·Î ÇÁ·Î±×·¥¿¡ ¹Ú¾Æ ³ÖÁö
   ¾Ê°í, ÆÄÀÏ·Î °ü¸®Çϱ⸦ ¿øÇÑ´Ù¸é, ±×·¸°Ô Çϼŵµ µË´Ï´Ù.
   JDFÀÇ Configuration Framework À» ÂüÁ¶Çϼ¼¿ä.


PS: ȤÀÚ´Â ¿Ö ConnectionResource ÀÇ release() ¸Þ¼Òµå°¡ ÇÊ¿äÇÏ³Ä°í ¹Ý¹®ÇÒ ¼öµµ ÀÖ½À
   ´Ï´Ù. ¿¹¸¦ µé¾î °³¹ßÀÚÀÇ ¼Ò½º°¡ ´ÙÀ½Ã³·³ µÇµµ·Ï Çصµ µÇÁö ¾Ê´À³Ä¶ó´Â °ÅÁÒ.

    -----------------------------------------------------------
    .....
    Connection conn = null;
    Statement stmt = null;
    try {
      conn = ConnectionResource.getConnection(); // <---- !!!

      stmt = conn.createStatement();
      .....
    }
    catch(Exception e){
      .....
    }
    finally {
      if ( stmt != null ) try{stmt.close();}catch(Exception e){}
      if ( conn != null ) try{conn.close();}catch(Exception e){} // <---- !!!
    }
    -----------------------------------------------------------

  ÀÌ·¸°Ô Çϼŵµ Å« ¹«¸®´Â ¾ø½À´Ï´Ù. ±×·¯³ª, JDBC 2.0 À» Áö¿øÇÏ´Â Á¦Ç°¿¡¼­¸¸
  conn.close() ¸¦ ÅëÇØ ÇØ´ç Connection À» ½ÇÁ¦ close() ½ÃÅ°´Â °ÍÀÌ ¾Æ´Ï¶ó DB Pool¿¡
  ¹ÝȯÇÏ°Ô µË´Ï´Ù. BEA WebLogic À̳ª IBM WebSphere 3.0.2.x, 3.5.x µîÀÌ ±×·¸½À´Ï´Ù.
  ±×·¯³ª, ÀÚüÁ¦ÀÛµÈ ´ëºÎºÐÀÇ DB Connection Pool ±â´ÉÀº Connection À» DB Pool¿¡
  ¹ÝȯÇÏ´Â °íÀ¯ÇÑ API¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. WebSphere Version 2.0.x ¿¡¼­´Â
  cmConn.releaseIBMConnection(), Oracle OSDK ¿¡¼­´Â trx.close(conn, "<pool_name">);
  Hans Bersten ÀÇ DBConnectionManager ÀÇ °æ¿ì´Â
  connMgr.freeConnection(poolname, conn); µîµî ¼­·Î ´Ù¸¨´Ï´Ù. ÀÌ·¯ÇÑ Á¦Ç°µé±îÁö
  ¸ðµÎ Áö¿øÇÏ·Á¸é "release()" ¶ó´Â ¿ì¸®µé(!)¸¸ÀÇ ¿¹¾àµÈ ¸Þ¼Òµå°¡ ²À ÇÊ¿äÇÏ°Ô µË´Ï´Ù.

  ¹°·Ð, java.sql.Connection Interface¸¦ implements ÇÑ º°µµÀÇ MyConnection À» ¸¸µé¾î
  µÎ°í, ½ÇÁ¦ java.sql.Connection À» ¾òÀº ÈÄ MyConnectionÀÇ »ý¼ºÀÚ¿¡ ±× reference¸¦
  ³Ö¾îÁØ ÈÄ, À̸¦ return ½Ã¿¡ ³Ñ±âµµ·Ï ÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̶§, MyConnectionÀÇ
  close() ÇÔ¼ö¸¦ ¾à°£ °³Á¶ÇÏ¿© DB Connection Pool·Î µ¹¾Æ°¡°Ô ÇÒ ¼ö ÀÖÀ¸´Ï±î¿ä.


PS: Çϳª ÀÌ»óÀÇ DB ¸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é, ´ÙÀ½°ú °°Àº »ý¼ºÀÚ¸¦ Ãß°¡·Î ¸¸µé¾î¼­ ±¸ºÐÄÉ
  ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

  -----------------------------------------------------------
  ....
  private String poolname = "default_pool_name";
  private String userid = "scott";
  private String password = "tiger";
  public ConnectionResource() throws Exception {
    initialize();
  }
  public ConnectionResource(String poolname) throws Exception {
    this.poolname = poolname;
    initialize();
  }
  public ConnectionResource(String poolname,String userid, String passwrod)
  throws Exception
  {
    this.poolname = poolname;
    this.userid = userid;
    this.password = password;
    initialize();
  }
  private void initialize() throws Exception {
    ....
  }
  ...
  -----------------------------------------------------------



-------------------------------------------------------------------------------
2001.03.20 Ãß°¡
2001.10.22 ¼öÁ¤
2001.11.09 ¼öÁ¤(¾Æ·¡ ¼³¸íÀ» Ãß°¡ÇÔ)

½Ç ¿î¿µ »çÀÌÆ®ÀÇ Àå¾ÖÁø´Ü ¹× Æ©´×À» ´Ù³àº¸¸é, Àå¾ÖÀÇ ¿øÀÎÀÌ DataBase ¿¬°á°³¼ö°¡
Áö¼ÓÀûÀ¸·Î Áõ°¡ÇÏ°í, Connection Pool ¿¡¼­ ´õÀÌ»ó °¡¿ëÇÑ ¿¬°áÀÌ ³²¾Æ ÀÖÁö ¾Ê¾Æ
¹ß»ýÇÏ´Â ¹®Á¦°¡ ÀÇ¿Ü·Î ¸¹½À´Ï´Ù. ÀÌ »óȲÀÇ ½ÊÁßÆȱ¸´Â °³¹ßÀÚÀÇ Äڵ忡¼­ Pool·Î
ºÎÅÍ °¡Á®¿Â DB¿¬°áÀ» »ç¿ëÇÏ°í ³­ ÈÄ, À̸¦ ¿©ÇÏÇÑÀÇ Exception »óȲ¿¡¼­µµ ´Ù½Ã
Pool·Î µ¹·Áº¸³»¾ß ÇÑ´Ù´Â Rule ¸¦ ÁöÅ°Áö ¾Ê¾Æ¼­ ¹ß»ýÇÑ ¹®Á¦°¡ ŹÝÀÔ´Ï´Ù.
À̸§¸¸ ¸»ÇÏ¸é ´©±¸³ª ¾Ë¹ýÇÑ Å­Á÷ÇÑ ±ÝÀ¶/¹ðÅ·»çÀÌÆ®ÀÇ ÇÁ·Î±×·¥¼Ò½º¿¡¼­µµ ¸¶Âù°¡Áö
ÀÔ´Ï´Ù.
¹®Á¦´Â ºÐ¸íÈ÷ ¾î¶² ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ DB Connection À» Á¦´ë·Î ¹ÝȯÇÏÁö ¾ÊÀº
°ÍÀº ºÐ¸íÇѵ¥, ±× "¾î¶² ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥"ÀÌ ²ÀÁý¾î ¹¹³Ä ¶ó´Â °ÍÀ» ã¾Æ³»±â¶õ
Á¤¸» ½±Áö ¾Ê½À´Ï´Ù. Á¤¸» ½±Áö ¾Ê¾Æ¿ä. 1ÃÊ´ç ¼ö½Ê°³¾¿ÀÇ Request °¡ ´Ù¾çÇÏ°Ô µé¾î
¿À´Â »óȲ¿¡¼­, "netstat -n"À¸·Î º¸ÀÌ´Â TCP/IP ·¹º§¿¡¼­ÀÇ DB¿¬°á¼ö´Â ºÐ¸íÈ÷ Áõ°¡
ÇÏ°í Àִµ¥, ±× ¼ö½Ê°³ Áß ¾î¶² °ÍÀÌ ¹®Á¦¸¦ ¾ß±âÇÏ´À³Ä¸¦ µµÀúÈ÷ ¸øã°Ú´Ù´Â °ÍÀÌÁö¿ä.
»ç¿ëÀÚ°¡ ¾Æ¹«µµ ¾ø´Â »õº®¿¡ Çϳª¾¿ ÄÁÅÙÃ÷¸¦ ²À²À ´­·¯ º»µé, ±× ¹®Á¦ÀÇ »óȲÀº
´ëºÎºÐ Á¤»óÀûÀÎ ·ÎÁ÷ flow ¿¡¼­´Â ³ªÅ¸³ªÁö ¾Ê°í, ¾î¶² Ưº°ÇÑ Á¶°Ç, ȤÀº ¾î¶²
Exception ÀÌ ¹ß»ýÇÒ ¶§¸¸ ³ªÅ¸³¯ ¼ö Àֱ⠶§¹®¿¡, ÀÌ·± ¹æ¹ýÀ¸·Î´Â ¼Õ¹ß°ú ´«¸¸ ¾ÆÇÁ°Ô
µÇ°ï ÇÕ´Ï´Ù.

µû¶ó¼­, ¾ÖÃÊ ºÎÅÍ, ÀÌ·¯ÇÑ »óȲÀ» °í·ÁÇÏ¿©, ¸¸¾à, °³¹ßÀÚÀÇ Äڵ忡¼­ ½Ç¼ö·Î DB¿¬°áÀ»
Á¦´ë·Î Pool ¿¡ ¹ÝȯÇÏÁö ¾Ê¾ÒÀ» ¶§, ±× °³¹ßÀÚ ÇÁ·Î±×·¥ ¼Ò½ºÀÇ Å¬·¡½º À̸§°ú ÇÔ²²
Warnning ¼º ¸Þ¼¼Áö¸¦ ³²°Ü ³õÀ¸¸é, µÇÁö ¾Ê°Ú´À³Ä´Â °Ì´Ï´Ù.

Java ¿¡¼­´Â java.lang.Object ÀÇ finalize() ¶ó´Â ±â¸·ÇÑ ¸Þ¼Òµå°¡ ÀÖ½À´Ï´Ù. ÇØ´ç
Object instanceÀÇ reference °¡ ´õÀÌ»ó ±× ¾î¶² Thread ¿¡µµ ³²¾Æ ÀÖÁö ¾ÊÀ» °æ¿ì
JVMÀÇ GC°¡ ÀϾ ¶§ ±× Object ÀÇ finalize() ¸Þ¼Òµå¸¦ ²À Çѹø ºÒ·¯Áִϱî¿ä.

°è¼Ó ¹Ýº¹µÇ´Â ¾ê±âÀε¥, ¾Æ·¡ ±Û¿¡¼­ ¶ÇÇѹø °ü·Ã Àǹ̸¦ ãÀ» ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
Re: DB Connection Pool: Orphan and Idle Timeout
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=1005294960

¾Æ·¡´Â ÀÌ°ÍÀ» ÀÀ¿ëÇÏ¿©, Hans Bergsten ÀÇ DBConnectionManager ¸¦ »ç¿ëÇÏ´Â
ConnectionAdapter Ŭ·¡½º¸¦ ¸¸µé¾î º» »ùÇÃÀÔ´Ï´Ù. Trace/Debuging À» À§ÇÑ ¸î°¡Áö
±â´ÉÀÌ Ã·°¡µÇ¾î ÀÖÀ¸¸ç, ´Ù¸¥ ConnectionPoolÀ» À§ÇÑ Connection Adapter ¸¦ ¸¸µé¶§µµ
¾à°£¸¸ ¼öÁ¤/ÀÀ¿ëÇÏ¿© »ç¿ëÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.


/**
* Author : Lee WonYoung, javaservice@hanmail.net
* Date   : 2001.03.20, 2001.10.22
*/

import java.util.*;
import java.sql.*;
import java.io.*;
import java.text.SimpleDateFormat;

public class ConnectionResource
{
    private boolean DEBUG_MODE = true;
    private String DEFAULT_DATASOURCE = "idb";  // default db name
    private long GET_CONNECTION_TIMEOUT = 2000; // wait only 2 seconds if no
                                                // avaiable connection in the pool
    private long WARNNING_MAX_ELAPSED_TIME = 3000;

    private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd/HHmmss");
    private db.DBConnectionManager manager = null;
    private Connection conn = null;
    private String datasource = DEFAULT_DATASOURCE;
    private String caller = "unknown";
    private long starttime = 0;

    private static int used_conn_count = 0;
    private static Object lock = new Object();

    // detault constructor
    public ConnectionResource()
    {
        manager = db.DBConnectionManager.getInstance();
    }

    // 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
    {
        return getConnection(DEFAULT_DATASOURCE);
    }

    public Connection getConnection(String datasource)  throws Exception
    {
        if ( conn != null ) throw new Exception
            ("You must release the connection first to get connection again !!");

        this.datasource = datasource;
        // CONNECTION_TIMEOUT is very important factor for performance tuning
        conn = manager.getConnection(datasource, GET_CONNECTION_TIMEOUT);
        synchronized( lock ) { ++used_conn_count; }
        starttime = System.currentTimeMillis();
        return conn;
    }

    // you don't have to get "connection reference" as parameter,
    // because we already have the referece as the privae member variable.
    public synchronized void release() throws Exception {  
        if ( conn == null ) return;
        // The following is needed for some DB connection pool.
        boolean mode = true;
        try{
            mode = conn.getAutoCommit();
        }catch(Exception e){}
        if ( mode == false ) {
            try{conn.rollback();}catch(Exception e){}
            try{conn.setAutoCommit(true);}catch(Exception e){}
        }
        manager.freeConnection(datasource, conn);
        conn = null;
        int count = 0;
        synchronized( 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();
        }
    }
}

-------------------------------------------------------------------------------

À§ÀÇ Connection Adaptor Ŭ·¡½º¸¦ Servlet À̳ª JSP¿¡¼­ »ç¿ëÇÒ ¶§´Â ´ÙÀ½°ú °°ÀÌ
»ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.


»ç¿ë¹ý: DB Transaction 󸮰¡ ÇÊ¿äÄ¡ ¾ÊÀ» ¶§...


ConnectionResource resource = null;
Connection conn = null;
Statement stmt = null;
try{
    // For debugging and tracing, I recommand to send caller's reference to
    // the adapter's constructor.
    resource = new ConnectionResource(this); // <--- !!!
    //resource = new ConnectionResource();

    conn = resource.getConnection();
    // or you can use another database name
    //conn = resource.getConnection("other_db");

    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select ...");
    while(rs.next()){
        .....
    }
    rs.close();

}
//catch(Exception e){
//    // error handling if you want
//    ....
//}
finally{
    if ( stmt != null ) try{stmt.close();}catch(Exception e){}
    if ( conn != null ) resource.release(); // <--- !!!
}

-------------------------------------------------------------------------------
»ç¿ë¹ý: Transaction 󸮰¡ ÇÊ¿äÇÒ ¶§.

ConnectionResource resource = null;
Connection conn = null;
Statement stmt = null;
try{
    // For debugging and tracing, I recommand to send caller's reference to
    // the adapter's constructor.
    resource = new ConnectionResource(this);
    //resource = new ConnectionResource();

    conn = resource.getConnection();
    // or you can use another database name
    //conn = resource.getConnection("other_db");

    conn.setAutoCommit(false); // <--- !!!

    stmt = conn.createStatement();
    stmt.executeUpdate("update ...");
    stmt.executeUpdate("insert ...");
    stmt.executeUpdate("update ...");
    stmt.executeUpdate("insert ...");
    stmt.executeUpdate("update ...");
    
    int affected = stmt.executeUpdate("update....");
    // depends on your business logic,
    if ( affected == 0 )
        throw new Exception("NoAffectedException");
    else if ( affected > 1 )
        throw new Exception("TooManyAffectedException:" + affected);

    conn.commit(); //<<-- commit() must locate at the last position in the "try{}"
}
catch(Exception e){
    // if error, you MUST rollback
    if ( conn != null ) try{conn.rollback();}catch(Exception e){}

    // another error handling if you want
    ....
    throw e; // <--- throw this exception if you want
}
finally{
    if ( stmt != null ) try{stmt.close();}catch(Exception e){}
    if ( conn != null ) resource.release(); // <-- NOTE: autocommit mode will be
                                            //           initialized
}
-----------------------------------------------------------------

PS: ´õ ±íÀÌÀÖ´Â ³»¿ëÀ» ¿øÇÏ½Ã¸é ´ÙÀ½ ¹®¼­µéÀ» ÂüÁ¶ Çϼ¼¿ä...
    JDF Á¦4ź - DB Connection Pool
    http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945156790

    JDF Á¦5ź - DB Connection Resource Framework
    http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945335633

    JDF Á¦6ź - Transactional Connection Resource Framework
    http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945490586


PS: IBM WebSphereÀÇ JDBC Connection Pool ¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é ´ÙÀ½ ¹®¼­µµ ²À ÂüÁ¶
Çϼ¼¿ä...
    Websphere V3 Connection Pool »ç¿ë¹ý
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=970209527
    WebSphere V3 DB Connection Recovery ±â´É °íÂû
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=967473008



-------------------------------------------------------  
  º» ¹®¼­´Â ÀÚÀ¯·Ó°Ô ¹èÆ÷/º¹»ç ÇÒ ¼ö ÀÖÀ¸³ª ¹Ýµå½Ã
  ÀÌ ¹®¼­ÀÇ ÀúÀÚ¿¡ ´ëÇÑ ¾ð±ÞÀ» »èÁ¦ÇÏ½Ã¸é ¾ÈµË´Ï´Ù
================================================
  ÀÚ¹Ù¼­ºñ½º³Ý ÀÌ¿ø¿µ
  E-mail: javaservice@hanmail.net
  PCS:011-898-7904
================================================

* iWiz´Ô¿¡ ÀÇÇؼ­ °Ô½Ã¹° À̵¿µÇ¾ú½À´Ï´Ù (2010-02-03 16:57)



62   ÇÑ JSP ÆäÀÌÁö³»¿¡¼­ ºÐ±â¿¡ µû¸¥ ´Ù±¹¾î Áö¿ø  iWiz 2004/01/04 9778 28
61   ÇÁ·Î±×·¥¿¡¼­ LinkedHashMapÀÇ È°¿ë ¹æ¹ý  iWiz 2004/03/08 17848 30
60   Á¤±ÔÇ¥Çö½Ä¿¡¼­ Á¦ÇÑµÈ ¿µ¿ª¸¸ replace ÇÏ±â  iWiz 2004/01/04 5330 26
59   ÀÚÁÖ »ç¿ëµÇ´Â Á¤±Ô Ç¥Çö½Ä »ùÇà  iWiz 2004/01/04 11244 33
58   ÀÚ¹Ù Ä÷º¼Ç °´Ã¼ ºñ±³Ç¥  iWiz 2004/07/12 9215 28
57   ÀÎÅÍ³Ý ¸ÞÀÏ ÀÎÄÚµù ¹× HTML ó¸®  iWiz 2004/07/12 13370 28
56   ÀÎÅÍ³Ý ¸ÞÀÏ ¸Þ½ÃÁöÀÇ ±¸Á¶  iWiz 2004/07/12 7597 31
55   ÀÎÅÍ³Ý ¸ÞÀÏ MIME ±Ô°Ý  iWiz 2004/07/12 13108 34
54   À¥ÆäÀÌÁö¿¡¼­ ºñÁÖ¾óÇÑ ³¯Â¥¼±Åñ⸦ »ç¿ëÇÏÀÚ  iWiz 2004/01/04 6812 33
53   À¥»çÀÌÆ®ÀÇ »õ·Î¿î Çõ¸í Ajax [13]  iWiz 2005/11/22 6227 6
52   ¿ÜºÎ URL¿¡ Á¢¼ÓÇØ ÆäÀÌÁö ³»¿ëÀ» Àоî¿À´Â ¸Þ¼Òµå  iWiz 2004/01/04 5538 30
51   ¼öÁ¤µÈ ÀÎÅÍ³Ý ÀͽºÇ÷η¯¿¡¼­ »óÈ£ÀÛ¿ë ActiveX ÄÁÆ®·Ñ È°¼ºÈ­ °¡ÀÌµå  iWiz 2006/03/03 8841 4
50   ¼­ºí¸´À» ÀÌ¿ëÇØ 1 Çȼ¿ Åõ¸íÀ̹ÌÁö Ãâ·ÂÇÏ±â  iWiz 2004/03/23 7743 25
  ¼­ºí¸´ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× 2  iWiz 2004/01/04 5936 40
48   ¼­ºí¸´ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× 1  iWiz 2004/01/04 7706 29

1 [2][3][4][5]
 

Copyright 1999-2025 Zeroboard / skin by zero
iWiz ShareBase, ¨ÏCopyleft by iWiz.  For more information contact .
º» À¥»çÀÌÆ®¿¡ °Ô½ÃµÈ À̸ÞÀÏ ÁÖ¼Ò°¡ ÀüÀÚ¿ìÆí ¼öÁý ÇÁ·Î±×·¥À̳ª ±× ¹ÛÀÇ ±â¼úÀû ÀåÄ¡¸¦ ÀÌ¿ëÇÏ¿© ¹«´ÜÀ¸·Î ¼öÁýµÇ´Â °ÍÀ» °ÅºÎÇϸç, À̸¦ À§¹Ý½Ã¿¡´Â Á¤º¸Åë½Å¸Á¹ý¿¡ ÀÇÇØ Çü»çó¹úµÊÀ» À¯³äÇϽñ⠹ٶø´Ï´Ù. [°Ô½ÃÀÏ 2004. 1. 31]