¼Ò¼³°°Àº ÀÚ¹Ù 4ºÎ  Á¦19Àå µ¥ÀÌÅͺ£À̽º  19.11.3 ConnectionPool °³¼±  

 

    19.11.3 ConnectionPool °³¼±½Ã۱â

 

ÀÌÀü Àý¿¡¼­ ¿ì¸®°¡ ¸¸µé¾ú´ø ConnectionPoolŬ·¡½º´Â µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼ÇÀÇ °³¼ö¸¦ Á¦ÇÑ ÇÒ ¼ö ¾ø¾ú½À´Ï´Ù. ÇÏÁö¸¸, Àüü ½Ã½ºÅÛÀÇ ¾ÈÁ¤¼ºÀ» À§Çؼ­´Â Ä¿³Ø¼ÇÀÇ ¼ö¸¦ Á¦ÇÑ ÇÒ ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù. ¸¸¾à ¾î¶² ½Ã½ºÅÛÀÌ 100°³ÀÇ Ä¿³Ø¼Ç¸¸À» Çã¿ëÇÑ´Ù¸é, ±× ÀÌ»óÀÇ Ä¿³Ø¼ÇÀº ¸¸µé ¼ö ¾øµµ·Ï ÇØ¾ß¸¸ ÇÕ´Ï´Ù. 20°³ÀÇ Ä¿³Ø¼ÇÀÌ ÀüºÎ »ç¿ë ÁßÀ̶ó°í Çϸé, ClientŬ·¡½º´Â »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀÌ »ý±æ ¶§±îÁö ±â´Ù·Á¾ß ÇÕ´Ï´Ù. À̰ÍÀ» À§ÇØ ¿ì¸®´Â 8Àå¿¡¼­ ¹è¿î wait, notify ±â¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

 

½ÇÁ¦·Î À̹ø Àý¿¡¼­ ¼Ò°³ÇÏ´Â È®ÀåµÈ ConnectionPool1Ŭ·¡½º´Â Ä¿³Ø¼ÇÀÇ ÃÖ´ë »ý¼º °³¼ö¸¦ Á¦ÇÑÇϰí, ±× °³¼ö ÀÌ»óÀÇ ¿äûÀÌ µé¾î¿À¸é ³ª¸ÓÁö ¿äûµéÀº »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀÌ »ý±æ ¶§±îÁö wait¸¦ »ç¿ëÇØ¼­ ´ë±â ½Ãŵ´Ï´Ù. ÀÌ·¯ÇÑ ´ë±â´Â »ç¿ëÀÌ ³¡³­ Ä¿³Ø¼ÇÀÌ releaseConnection()¸Þ¼­µå¸¦ ÅëÇØ ¹ÝȯµÇ¸é notify()¸¦ »ç¿ëÇØ¼­ ÅëÁöÇÏ°Ô µË´Ï´Ù.

 

¸ÕÀú È®ÀåµÈ ConnectionPool1Ŭ·¡½ºÀÇ Àüü Äڵ带 »ìÆìº¸°Ú½À´Ï´Ù. Á¶±Ý ±æ¾î º¸À̱â´Â ÇÏÁö¸¸, ´ëºÎºÐÀÌ ÀÌÀü Àý¿¡¼­ ¸¸µç ConnectionPoolŬ·¡½º¿Í °ãÄ¡´Â ³»¿ëÀÌ´Ï Àß »ìÆì º¸½Ã±â ¹Ù¶ø´Ï´Ù.

 

ConnectionPool1.java(È®ÀåµÈ ConnectionPool1Ŭ·¡½º ¿¹Á¦)

import java.sql.*;

import java.util.*;

public class ConnectionPool1 {

   private static ConnectionPool1 cp = null;

   private ConnectionFactory1 cf = null;

   private Vector pool = null;

   private int initCon = 0; 

   private int maxCon = 0;

   private int users = 0;

   private ConnectionPool1(int initCon, int maxCon) throws SQLException {

       this.initCon = initCon;

     this.maxCon = maxCon;

 

       cf = new ConnectionFactory1();

       pool = new Vector();

      for (int i=0; i < initCon; i++) {

        pool.add(createConnection());

     }

   }

   public static synchronized ConnectionPool1 getInstance() throws SQLException {

       if (cp == null) {

          cp = new ConnectionPool1(4,20);

       }

       return cp;

   }

   public synchronized Connection getConnection() throws SQLException {

       Connection conn = null;

       while ((conn = getPooledConnection()) == null)

     {

        try {

          wait();

        } catch (InterruptedException ie) {}

     }

       users++;

       return conn;

   }

   public synchronized void releaseConnection(Connection conn) {

       pool.add(conn);

       users--;

     notifyAll();

   }

   private Connection getPooledConnection() throws SQLException {

       Connection conn = null;

       int size = pool.size();

       if (size > 0) {

          conn = (Connection)(pool.elementAt(0));

          pool.removeElementAt(0);

       }  else if (users < maxCon || maxCon == 0) {

          pool.add(createConnection());

       }

       return conn;

   }

   private Connection createConnection()

   throws SQLException {

       Connection conn = cf.getConnection(ConnectionFactory1.ODBC);

       System.out.println("== a connection was created");

       return conn;

   }

}

C:\JavaExample\19> javac ConnectionPool1.java

 

È®ÀåµÈ ConnectionPool1 Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ ¼¼ °³ÀÇ Á¤¼öÇü º¯¼ö¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

 

n        private int initCon = 0;

n        private int maxCon = 0;

n        private int users = 0;

 

 initConÀº ConnectionPool1ÀÌ »ý¼ºµÉ ¶§ ¸¸µé¾î ³õÀ» Ä¿³Ø¼ÇÀÇ °³¼ö ÀÔ´Ï´Ù. maxConÀº ÀÌ ConnectionPool1 ÀÌ »ý¼ºÇÒ ¼ö ÀÖ´Â ÃÖ´ë Ä¿³Ø¼ÇÀÇ °³¼öÀÔ´Ï´Ù. users´Â ÇöÀç »ç¿ëÁßÀÎ Ä¿³Ø¼ÇÀÇ °³¼ö¸¦ ³ªÅ¸³À´Ï´Ù. Pool¿¡ º¸°ü µÇ¾î ÀÖ´Â »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀÇ °³¼ö¿Í usersÀÇ °ªÀ» ´õÇϸé, ÇöÀç ¸¸µé¾îÁø ÃÑ Ä¿³Ø¼ÇÀÇ °³¼ö¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù.

 

 »ý¼ºÀÚ¸¦ º¸½Ã¸é, ConnectionPool1 °´Ã¼°¡ »ý¼ºµÇ¸é¼­ initCon¿¡ ¸í½ÃµÈ °³¼ö¸¸Å­ Ä¿³Ø¼ÇÀ» ¹Ì¸® ¸¸µé¾î¼­ pool¿¡ ÀúÀåÇÏ´Â °ÍÀ» º¸½Ç ¼ö ÀÖ½À´Ï´Ù.

 

initCon¿¡ Á¤ÇØÁø °ª¸¸Å­ Ãʱâ Ä¿³Ø¼ÇÀ» »ý¼º

for (int i=0; i < initCon; i++) {

   pool.add(createConnection());

}

 

ÀÌÀü¿¡ ¸¸µé¾ú´ø ConnectionPool°ú´Â ´Þ¸® Ä¿³Ø¼ÇÀ» ¸¸µé ¶§ ConnectionFactory1ÀÇ getConnection()¸Þ¼­µå¸¦ ¹Ù·Î È£ÃâÇÏÁö ¾Ê°í, µû·Î ±¸ÇöµÇ¾î ÀÖ´Â createConnection()¸Þ¼­µå¸¦ È£ÃâÇϰí ÀÖ½À´Ï´Ù. createConnection()¸Þ¼­µå´Â ´Ü¼øÈ÷ ConnectionFactory1ÀÇ getConnection()¸Þ¼­µå¸¦ È£ÃâÇØ¼­ ½ÇÁ¦ µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼ÇÀ» ¹ÝÈ¯ÇØ ÁÝ´Ï´Ù.

 

 getConnection()¸Þ¼­µå´Â Á¶±Ý ¸¹ÀÌ º¯°æµÇ¾ú½À´Ï´Ù. ÀÌÀü ConnectionPoolŬ·¡½º¿¡¼­ getConnection()¸Þ¼­µå°¡ ó¸®Çß´ø ÀÛ¾÷ÀÎ, »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀ» Á¶»çÇϰí ÇÊ¿äÇÏ´Ù¸é »õ·Î¿î Ä¿³Ø¼ÇÀ» ¸¸µå´Â ÀÏÀº, getPooledConnectionÀ̶ó´Â »õ·Î ¸¸µé¾îÁø ¸Þ¼­µå¸¦ ÅëÇØ¼­ Á¦°ø µË´Ï´Ù. º¯°æµÈ getConnection()¸Þ¼­µå´Â Çʿ信 µû¶ó, ClientŬ·¡½º¸¦ ´ë±â ½ÃŰ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.

 

getConnection()¸Þ¼­µåÀÇ ³»ºÎ ±¸Çö

public synchronized Connection getConnection()

throws SQLException {

   Connection conn = null;

   // Ä¿³Ø¼ÇÀ» ¾ò¾î¿Ã ¼ö ¾ø´Ù¸é ´ë±âÇϰí ÀÖÀ½

   while ((conn = getPooledConnection()) == null)   {

       try {

          // releaseConnection ¸Þ¼­µå°¡ È£ÃâµÇ¸é ÅëÁö ¹Þ´Â´Ù

          wait();

      } catch (InterruptedException ie) {}

   }

   // »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀ» ¾ò¾úÀ¸¸é, usersÀÇ °ªÀ» Çϳª Áõ°¡½ÃÄÑÁÜ

   users++;

   // Client Ŭ·¡½º¿¡°Ô Ä¿³Ø¼Ç ³Ñ°ÜÁÜ

   return conn;

}

 

 getConnection()¸Þ¼­µå´Â ³»ºÎ¿¡¼­ getPooledConnection()¸Þ¼­µå¸¦ È£ÃâÇϰí ÀÖ½À´Ï´Ù. getPooledConnection()¸Þ¼­µå´Â ¸¸µé¾îÁø Ä¿³Ø¼ÇÀÌ ÃÖ´ë °³¼ö¿¡ µµ´ÞÇØ¼­ ´õ ÀÌ»ó ¸¸µé ¼ö ¾øÀ» ¶§´Â nullÀ» ¹Ýȯ ÇÕ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ getPooledConnection()À¸·ÎºÎÅÍ ³Ñ°Ü ¹ÞÀº Connection°´Ã¼°¡ nullÀÎ °æ¿ì wait()¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ »ç¿ëÀÚ¸¦ Àá½Ã ´ë±â ½Ãŵ´Ï´Ù. ´ë±âÁß¿¡, ´Ù¸¥ ClientŬ·¡½º°¡ releaseConnection()¸Þ¼­µå¸¦ È£ÃâÇØ¼­ »ç¿ëÀÌ ³¡³­ Ä¿³Ø¼ÇÀ» ¹ÝȯÇϸé, wait·Î ´ë±âÇϰí ÀÖ´ø ClientŬ·¡½ºµéÀº ÅëÁö¸¦ ¹Þ½À´Ï´Ù. ´ë±â¿¡¼­ ±ú¾î³­ ClientŬ·¡½º´Â ´Ù½Ã getPooledConnection()¸Þ¼­µå¸¦ È£ÃâÇØ¼­ Ä¿³Ø¼ÇÀ» °Ç³× ¹Þ°í getConnection()¸Þ¼­µå¸¦ ºüÁ®³ª°©´Ï´Ù. ½ÇÁ¦·Î releaseConnection()¸Þ¼­µå¸¦ »ìÆìº¸½Ã¸é ´ÙÀ½Ã³·³ notifyAll()¸Þ¼­µå¸¦ È£ÃâÇϰí ÀÖ½À´Ï´Ù.

 

releaseConnection()¸Þ¼­µåÀÇ ³»ºÎ ±¸Çö

Public synchronized void releaseConnection(Connection conn) {

   pool.add(conn);

   users--;

   notifyAll();

}

 

 releaseConnection()¸Þ¼­µå´Â ¹Ýȯ ¹ÞÀº Ä¿³Ø¼ÇÀ» poolÀÇ Á¦ÀÏ ³¡¿¡ ÀúÀåÇϰí, usersÀÇ °ªÀ» Çϳª °¨¼Ò ½Ãŵ´Ï´Ù. ±×¸®°í´Â notifyAll()¸Þ¼­µå¸¦ È£ÃâÇÏ¿© getConnection()¸Þ¼­µå ¾È¿¡¼­ ´ë±âÁßÀÎ ClientŬ·¡½ºµé¿¡°Ô »ç¿ë °¡´ÉÇÑ Ä¿³Ø¼ÇÀÌ »ý°å´Ù°í ÅëÁöÇØ ÁÝ´Ï´Ù.

 

 ÀÌÀüÀÇ ConnectionPoolŬ·¡½º¿¡ 8Àå¿¡¼­ ¹è¿î ´ë±â(wait)¿Í ÅëÁö(notifyAll) ±â¹ýÀ» »ç¿ëÇØ¼­ º¸´Ù ±¸Ã¼ÀûÀÎ Ä¿³Ø¼Ç °ü¸®¸¦ ÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ÇÏÁö¸¸ È®ÀåµÈ ConnectionPool1Ŭ·¡½º ¿ª½Ã ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. ¿¹¸¦ µé¾î getConnection()¸Þ¼­µå¿¡¼­ wait()¸¦ »ç¿ëÇØ¼­ ClientŬ·¡½º¸¦ ´ë±â ½Ãų ¶§, ´ë±â ½Ã°£À» ÁöÁ¤ÇØ ÁÙ ¼öµµ ÀÖ½À´Ï´Ù. ¾ðÁ¦³ª °í¹Î ¼Ó¿¡¼­ »õ·Î¿î °¡´É¼ºÀÌ º¸À̱⠸¶·ÃÀÔ´Ï´Ù. Áö±Ý±îÁö ¸¸µé¾îº» ´Ù¾çÇÑ ±â¹ýµéÀ» Àß ¿¬±¸Çؼ­ º¸´Ù ¾ÈÁ¤ÀûÀÌ°í ¼º´ÉÀÌ ÁÁÀº JDBC ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µå½Ã±â ¹Ù¶ø´Ï´Ù.



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù4ºÎ
ÀúÀÚ:ÃÖ¿µ°ü