ÀÌÀü Àý¿¡¼ ¿ì¸®°¡ ¸¸µé¾ú´ø 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ºÎ ÀúÀÚ:ÃÖ¿µ°ü |