[Áöµð³ÝÄÚ¸®¾Æ]ÇϳªÀÇ ConnectionÀ» init()¿¡ ¹Ì¸® ¿¬°áÇØ µÎ°í »ç¿ëÇÏ´Â °æ¿ì
public class TestServlet extends HttpServlet {
private final static String drv = "oracle.jdbc.driver.OracleDriver";
private final static String url = "jdbc:orache:thin@210.220.251.96:1521:ORA8i";
private final static String user = "scott";
private final static String password = "tiger";
private ServletContext context;
private Connection conn = null; <--- !!!
public void init(ServletConfig config) throws ServletException {
super.init(config);
context = config.getServletContext();
try {
Class.forName(drv);
conn = DriverManager.getConnection(url,user,password);
}
catch (ClassNotFoundException e) {
throw new ServletException("Unable to load JDBC driver:"+ e.toString());
}
catch (SQLException e) {
throw new ServletException("Unable to connect to database:"+ e.toString());
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Statement stmt = null;
ResultSet rs = null;
String id = req.getParameter("id");
stmt = conn.createStatement();
rs = stmt.executeQuery("select ..... where id = '" + id + "'");
while(rs.next()) {
......
}
rs.close();
stmt.close();
.....
}
public void destroy() {
if ( conn != null ) try {conn.close();}catch(Exception e){}
}
}
À§¿¡¼ À߸øµÈ °ÍÀº ¹«¾ùÀϱî? ¼ºí·¿´ç Çϳª¾¿ java.sql.Connection À» init()¿¡¼ ¹Ì¸® ¸Î¾î µÎ°í »ç¿ëÇÏ´Â ±¸Á¶ÀÌ´Ù.
¾óÇÍ »ý°¢ÇÏ¸é ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Â °Í °°´Ù. doGet() ³»¿¡¼ º°µµÀÇ Statement¿Í ResultSet À» »ç¿ëÇϰí ÀÖÀ¸´Ï, °¢ Thread´Â ÀڽŸ¸ÀÇ Reference¸¦ °¡Áö°í »ç¿ëÇÏ¸é µÉ °Íó·³ º¸ÀδÙ.
ÀÌ ±¸Á¶¿£ Å©°Ô ¼¼°¡Áö ¹®Á¦°¡ ÀÖ´Ù. Çϳª´Â DB ¿¬°á ÀÚ¿øÀÇ ³¶ºñ¸¦ °¡Á®¿À¸ç, µÎ ¹øÂ°´Â ¼ö¸¹Àº µ¿½Ã »ç¿ëÀÚ¿¡ ´ëÇÑ Ã³¸® ÇѰ踦 °¡Á®¿À°í, ¸¶Áö¸·À¸·Î´Â insert, update, delete¿Í °°ÀÌ Çϳª ÀÌ»óÀÇ SQL¹®ÀåÀ» ¼öÇàÇÏ¸é¼ ´ÜÀÏÀÇ Transaction 󸮸¦ º¸Àå¹ÞÀ» ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù.
1) ´ë·®ÀÇ µ¿½Ã »ç¿ëÀÚ Ã³¸® ºÒ°¡
À§ÀÇ ±¸Á¶´Â ¼ºí·¿´ç Çϳª¾¿ java.sql.ConnectionÀ» Á¡À¯Çϰí ÀÖ´Ù. ½Ç ÇÁ·ÎÁ§Æ®¿¡¼ º¸Åë ¼ºí·¿ÀÌ ¸î°³³ª µÉ¿ä? ÃÖ¼Ò 100°³¿¡¼ 400°³°¡ ³Ñ¾î °¥ ¶§µµ ÀÖ´Ù. ±×·¸´Ù¸é java.sql.Connection¿¡ ÇÒ´çµÅ¾ß ÇÒ DB¿¬°á¼öµµ ¼ºí·¿ °¹¼ö ¸¹Å ÇÊ¿äÇÏ°Ô µÈ´Ù.
DB ¿¬°á ÀÚ¿øÀº DB¿¡¼ ¼³Á¤Çϱ⠳ª¸§ÀÌÁö¸¸ Åë»ó maximumÀ» ¼ÂÆÃÇÑ´Ù. ÇÏÁö¸¸ ¿äûÀÌ ¾øÀ» °æ¿ì¿¡µµ 400¿©°³ÀÇ DB°¡ ¿¬°áµÅ ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀº ÀÚ¿øÀÇ ³¶ºñ´Ù.
2) ´ë·®ÀÇ µ¿½Ã »ç¿ëÀÚ Ã³¸® ºÒ°¡
¶ÇÇÑ °°Àº ¼ºí·¿¿¡ ´ëÇØ µ¿½Ã¿¡ 100 ÀÌ»óÀÇ ¿äûÀÌ µé¾î¿Â´Ù°í °¡Á¤Çغ¸ÀÚ. ÀÌ °æ¿ì µ¿ÀÌÇÑ java.sql.Connection¿¡ ´ëÇØ °¢°¢ÀÇ ¿äûÀÌ conn.createStatement()¸¦ È£ÃâÇÏ°Ô µÈ´Ù.
¹®Á¦´Â ÇϳªÀÇ Connection¿¡ ´ëÇØ µ¿½Ã¿¡ OpenÇÒ ¼ö ÀÖ´Â Statement ¼ö(ÀÌ ¿ª½Ã DB ¿¡¼ ¼ÂÆÃÇϱ⠳ª¸§ÀÌÁö¸¸)ÀÇ maximum¿¡ Á¦ÇÑÀÌ ÀÖ´Ù. ¿À¶óŬÀÇ °æ¿ì Default´Â 50ÀÌ´Ù. ¸¸¾à ÀÌ ¼öÄ¡ ÀÌ»óÀ» µ¿½Ã¿¡ OpenÇÏ·Á°í Çϸé "maximum open cursor exceed !" ¶ó´Â SQLExceptoinÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.
¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ.
public class DbTest {
public static void main(String[] args) throws Exception {
Class.forName("jdbc driver...");
Connection conn = DriverManager.getConnection("url...","id","password");
int i=0;
while(true) {
Statement stmt = conn.createStatement();
System.out.println( (++i) + "- stmt created");
}
}
}
°ú¿¬ ¸î°³±îÁö conn.createStement()°¡ ¼öÇàµÉ °ÍÀΰ¡? ÀÌ´Â DB¿¡¼ ¼³Á¤Çϱ⠳ª¸§ÀÌ´Ù. Áß¿äÇÑ °ÍÀº ÇѰ谡 ÀÖ´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ conn.createStatement()À» ÅëÇØ ¸¸µé¾îÁø stmt´Â java.sql.ConnectionÀÇ ÀÚ¿øÀ̱⠶§¹®¿¡ À§Ã³·³ stmtÀÇ reference°¡ ¾ø¾îÁ®µµ GC(Garbage Collection)°¡ µÇÁø ¾Ê´Â´Ù.
3) Transaction Áߺ¹Çö»ó ¹ß»ý
¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº ¼ºñ½º°¡ ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ.
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Statement stmt = null;
String id = req.getParameter("id");
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("update into XXXX..... where id = " + id + "'");
stmt.executeUpdate("delete from XXXX..... where id = " + id + "'");
stmt.executeUpdate(".... where id = " + id + "'");
stmt.executeUpdate(".... where id = " + id + "'");
conn.commit();
}
catch(Exception e){
try{conn.rollback();}catch(Exception e){}
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
conn.setAutoCommit(true);
}
.....
}
¾Æ¹«·± ¹®Á¦°¡ ¾øÀ» µíµµ ÇÏ´Ù. ÇÏÁö¸¸ À§ÀÇ ¼ºñ½º¸¦ µ¿½Ã¿¡ ¿äûÇÏ¸é °°Àº java.sql.ConnectionÀ» °®°í ÀÛ¾÷À» Çϰí ÀÖÀ¸´Ï TransactionÀÌ ÁßøµÈ´Ù. ¿Ö³ÄÇϸé conn.commit(), conn.rollback()°ú °°ÀÌ connÀ̶ó´Â Connection¿¡ ´ëÇØ TransactionÀÌ °ü¸®µÇ±â ¶§¹®.
¿äû A°¡ ÃÑ 4°³ÀÇ SQL¹®Àå Áß 3°³¸¦ Á¤»óÀûÀ¸·Î ¼öÇàÇÏ°í ¸¶Áö¸· 4¹øÂ°ÀÇ SQL¹®ÀåÀ» ¼öÇàÇÏ·Á ÇÑ´Ù. À̶§ ¿äû B°¡ µÚµû¶ó µé¾î¿Í¼ 2°³ÀÇ SQL ¹®ÀåÀ» ¿½ÉÈ÷ ¼öÇàÇß´Ù. ±Ùµ¥ ¿äû A¿¡ ÀÇÇÑ ¸¶Áö¸· SQL ¹®Àå ¼öÇàÁß¿¡ SQLExceptionÀÌ ¹ß»ýÇß´Ù. ±×·¸´ã ¿äû A´Â catch(Exception e) Àý·Î ºÐ±â°¡ ÀϾ°í conn.rollback()À» ¼öÇàÇØ ÀÌ¹Ì ¼öÇàÇÑ 3°³ÀÇ SQL ¼öÇàµéÀ» ¸ðµÎ rollback½ÃŲ´Ù.
¹®Á¦´Â ¿äû B ¿¡ ÀÇÇØ ¼öÇàµÈ 2°³ÀÇ SQL¹®Àå±îÁö rollback()µÅ ¹ö¸°´Ù. ¿Ö³ÄÇÏ¸é µ¿ÀÏÇÑ conn °´Ã¼À̱⠶§¹®ÀÌ´Ù. °á±¹ ¿äû B´Â ¿µ¹®µµ ¸ð¸£°í ¸¶Áö¸· 2°³ÀÇ SQL¹®À常 ¼öÇàÇÏ°Ô µÈ´Ù.
Á¤¸®Çϸé, Connection, Statement, ResultSet ´Â doGet() , doPost() ³»¿¡¼ ¼±¾ðµÇ°í »ç¿ëµÅ¾ß ÇÑ´Ù. @
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Connection conn = null; <----- À̰÷À¸·Î ¿Í¾ßÁÒ..
Statement stmt = null; <-------
ResultSet rs = null; <---------
.....
}
¼ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× ¨ç
¼ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× ¨è