ÃÖÃÊÀÛ¼ºÀÏÀÚ: 2000/09/05 16:19:47
ÃÖ±Ù ¼öÁ¤ÀÏ : 2001.01.27
ÃÖ±Ù ¼öÁ¤ÀÏ : 2001.03.12(nested sql query issue)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2001.03.13(transaction)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2001.03.20(instance variables in JSP)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2001.04.03(¹®¸Æ¼öÁ¤)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2002.02.06("close ÇÒ ¶© Á¦´ë·Î..." Ãß°¡»çÇ×÷°¡)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2002.02.25("transaction°ü·Ã Ãß°¡")
ÃÖ±Ù ¼öÁ¤ÀÏ : 2002.06.11(PreparedStatement¿¡ ÀÇÇÑ ResultSet close À̽´)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2002.06.18(PreparedStatement°ü·Ã Ãß°¡)
ÃÖ±Ù ¼öÁ¤ÀÏ : 2002.12.30(Instance Variable °øÀ¯ 1.2 Ãß°¡)
´Ùµé ¾Æ½Ç¹ýÇÑ ´Ü¼øÇÑ ¾ê±é´Ï´Ù¸¸, ¾ÆÁ÷ ¸¹Àº ºÐµéÀÌ ¸ð¸£½Ã´Â °Í °°¾Æ ´Ù½ÃÇѹø
Á¤¸®ÇÕ´Ï´Ù. ¾Æ·¡ÀÇ °¢°¢ÀÇ ¿¹Á¦´Â À߸ø »ç¿ëÇÏ°í °è½Ã´Â ÀüÇüÀûÀÎ ¿¹µéÀÔ´Ï´Ù.
1. ¼ºí·¿¿¡¼ instance variable ÀÇ °øÀ¯
1.1 ¼ºí·¿¿¡¼ instance variable ÀÇ °øÀ¯ - PrintWriter -
´ÙÀ½°ú °°Àº Äڵ带 »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CountServlet extends HttpServlet {
private PrintWriter out = null; // <-------------- (1)
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
out = res.getWriter();
for(int i=0;i<20;i++){
out.println("count= " + (i+1) + "<br>"); // <---- (2)
out.flush();
try{Thread.sleep(1000);}catch(Exception e){}
}
}
}
À§ÀÇ CountServlet.java ¸¦ ÄÄÆÄÀÏÇÏ¿© µ¹·Á º¸¸é, 1Ãʰ£°ÝÀ¸·Î ÀÏ·ÃÀÇ ¼ýÀÚ°¡ ¿Ã¶ó°¡´Â
°ÍÀÌ º¸ÀÏ °Ì´Ï´Ù.(¼ºí·¿¿£ÁøÀÇ ±¸Çö¹æ½Ä¿¡ µû¶ó Buffering ÀÌ µÇ¾î 20Ãʰ¡ ¸ðµÎ Áö³
ÈÄ¿¡¼ ÆÜ ³ª¿Ã ¼öµµ ÀÖ½À´Ï´Ù.)
È¥ÀÚ¼ ´ÜÀÏ Request ¸¦ ³¯·Á º¸¸é, ¾Æ¹«·± ¹®Á¦°¡ ¾ø°ÚÁö¸¸, ÀÌÁ¦ ºê¶ó¿ìÁ® âÀ» µÎ°³ ÀÌ»ó
¶ç¿ì½Ã°í 10ÃÊÀÇ ½Ã°£ Â÷¸¦ µÎ½Ã¸é¼ µ¿½Ã¿¡ È£ÃâÇØ º¸¼¼¿ä... ÀÌ»óÇÑ Áõ»óÀÌ ³ªÅ¸³¯
°Ì´Ï´Ù. ¸ÕÀú È£ÃâÇÑ Ã¢¿¡´Â 10 ±îÁö Á¤µµ¸¸ ³ªÅ¸³ª°í, 10ÃÊ µÚ¿¡ È£ÃâÇÑ Ã¢¿¡¼´Â ¸ÕÀú
È£ÃâÇÑ Ã¢¿¡¼ ³ªÅ¸³ª¾ßÇÒ ³»¿ëµé±îÁö ´ýÀ¸·Î ³ªÅ¸³ª´Â °ÍÀ» ¸ñ°ÝÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù.
ÀÌ´Â ¼ºí·¿ÀÇ °¢ È£ÃâÀº Thread ·Î µ¿ÀÛÇÏ¿©, µû¶ó¼, °¢ È£ÃâÀº À§ÀÇ (1) ¿¡¼ ¼±¾ðÇÑ
instance variable µéÀ» °øÀ¯Çϱ⠶§¹®¿¡ ³ªÅ¸³ª´Â ¹®Á¦ÀÔ´Ï´Ù.
À§ ºÎºÐÀº ´ÙÀ½°ú °°ÀÌ °íÃÄÁ®¾ß ÇÕ´Ï´Ù.
public class CountServlet extends HttpServlet {
//private PrintWriter out = null;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
PrintWriter out = null; // <--- ÀÌ ÂÊÀ¸·Î ¿Í¾ßÁÒ !!!
res.setContentType("text/html");
out = res.getWriter();
for(int i=0;i<20;i++){
out.println("count= " + (i+1) + "<br>"); // <---- (2)
out.flush();
try{Thread.sleep(1000);}catch(Exception e){}
}
}
}
±¹³» ¸î¸î Servlet °ü·Ã ¼ÀûÀÇ ÀϺΠ¿¹Á¦µéÀÌ À§¿Í °°Àº À߸øµÈ ÇüÅ·Π¼³¸íÇÑ
¼Ò½ºÄÚµåµéÀÌ ´«¿¡ ¶ë´Ï´Ù. ºü¸¥ ½ÃÀÏ¿¡ ¹Ù·Î Àâ¾Æ¾ß ÇÒ °ÍÀÔ´Ï´Ù.
½ÇÁ¦ ÇÁ·ÎÁ§Æ® ȯ°æ¿¡¼ °³¹ßµÈ ½Ç¹«½Ã½ºÅÛ¿¡¼µµ, ±×·¯ÇÑ Ã¥À» ÅëÇØ °øºÎÇϽŵí, µ¿ÀÏÇÑ
À߸øµÈ ÄÚµùÀ» Çϰí ÀÖ´Â °³¹ßÀÚµéÀÌ ÀÖ½À´Ï´Ù. °á°úÀûÀ¸·Î Å×½ºÆ® ȯ°æ¿¡¼´Â ³ªÅ¸³ªÁö
¾Ê´õ´Ï¸¸, ¸·»ó ½Ã½ºÅÛÀ» ¿ÀÇÂÇÏ°í³ª´Ï °í°´À¸·Î ºÎÅÍ ´ÙÀ½°ú °°Àº ¼Ò¸®¸¦ µè½À´Ï´Ù.
"³» µ¥ÀÌŸ°¡ ¾Æ´Ñµ¥ ³²ÀÇ µ¥ÀÌŸ°¡ ³» ȸ鿡 °£È¤ ³ªÅ¸³ª¿ä. refresh ¸¦ ´©¸£¸é ¶Ç,
Á¦´ë·Î µÇ±¸¿ä" .....
1.2 ¼ºí·¿¿¡¼ instance variable ÀÇ °øÀ¯
¾Õ¼ÀÇ °æ¿ì¿Í Àǹ̸¦ °°ÀÌÇϴµ¥, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é ¾ÈµÈ´Ù´Â ¾ê±âÁö¿ä.
public class BadServlet extends HttpServlet {
private String userid = null;
private String username = null;
private int hitcount = 0;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
userid = request.getParameter("userid");
username = request.getParameter("username");
hitcount = hitcount + 1;
....
}
}
»õ·Î¿î ¸Å HTTP ¿äû¸¶´Ù userid/usernameº¯¼ö´Â »õ·Ó°Ô ÇÒ´çµË´Ï´Ù. ¹®Á¦´Â ±×°ÍÀÌ Æ¯Á¤
»ç¿ëÀÚ¿¡ ÇÑÇÏ¿© ±×·¯ÇÑ °ÍÀÌ ¾Æ´Ï¶ó, BadServletÀÇ ÀνºÅϽº(instance)´Â ÇØ´ç
À¥ÄÁÅ×À̳Ê(Web Container)¿¡ »ó¿¡¼ (¿¹¿Ü°æ¿ì°¡ ÀÖÁö¸¸) ´Ü Çϳª¸¸ Á¸ÀçÇϰí, ¼·Î ´Ù¸¥
¸ðµç »ç¿ëÀÚµéÀÇ ¼·Î ´Ù¸¥ ¸ðµç ¿äûµé¿¡ ´ëÇØ¼ µ¿ÀÏÇÑ userid/username ¹× count º¯¼ö¸¦
Á¢±ÙÇÏ°Ô µË´Ï´Ù. µû¶ó¼, ´ÙÀ½°ú °°ÀÌ ¸Þ¼Òµå ¾ÈÀ¸·Î ²ø¾îµé¿© »ç¿ëÇÏ¿©¾ß ÇÔÀ» °Á¶ÇÕ´Ï´Ù.
public class BadServlet extends HttpServlet {
//private String userid = null; // <---- !!
//private String username = null; // <---- !!
private int hitcount = 0;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
String userid = request.getParameter("userid"); // <---- !!
String username = request.getParameter("username"); // <---- !!
//¶ÇÇÑ, instance º¯¼ö¿¡ ´ëÇÑ Á¢±ÙÀº Àû¾îµµ ¾Æ·¡Ã³·³ µ¿±âȸ¦ °í·ÁÇØ¾ß...
synchronized(this){ hitcount = hitcount + 1; }
....
}
}
1.3 ¼ºí·¿¿¡¼ instance variable ÀÇ °øÀ¯ - DataBase Connection -
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; <--- !!!
private Statement stmt = null; <------ !!!
private ResultSet rs = null; <------ !!!
public void init(ServletConfig config) throws ServletException {
super.init(config);
context = config.getServletContext();
try {
Class.forName(drv);
}
catch (ClassNotFoundException e) {
throw new ServletException("Unable to load JDBC driver:"+ e.toString());
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
String id = req.getParameter("id");
conn = DriverManager.getConnection(url,user,password); ---- (1)
stmt = conn.createStatement(); ---------- (2)
rs = stmt.executeQuery("select .... where id = '" + id + "'"); ----- (3)
while(rs.next()) { ----------- (4)
...... --------- (5)
}
rs.close(); -------- (6)
stmt.close(); ---- (7)
conn.close(); --- (8)
.....
}
}
À§¿¡¼ ¹¹°¡ À߸øµÇ¾úÁÒ? ¿©·¯°¡Áö°¡ ÀÖ°ÚÁö¸¸, ±× Áß¿¡ Çϳª°¡ java.sql.Connection°ú
java.sql.Statment, java.sql.ResultSetÀ» instance variable ·Î »ç¿ëÇϰí ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù.
ÀÌ ¼ºí·¿Àº »ç¿ëÀÚ°¡ È¥ÀÚÀÏ °æ¿ì´Â ¾Æ¹«·± ¹®Á¦¸¦ ¾ß±âÇÏÁö ¾Ê½À´Ï´Ù. ±×·¯³ª ¿©·¯»ç¶÷ÀÌ
µ¿½Ã¿¡ ÀÌ ¼ºí·¿À» °°ÀÌ È£ÃâÇØ º¸¸é, ÀÌ»óÇÑ Áõ»óÀÌ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù.
±× ÀÌÀ¯´Â conn, stmt, rs µî°ú °°Àº reference µéÀ» instance º¯¼ö·Î ¼±¾ðÇÏ¿© µÎ¾ú±â
¶§¹®¿¡ ¹ß»ýÇÕ´Ï´Ù. ¼ºí·¿Àº Thread·Î µ¿ÀÛÇϸç À§Ã³·³ instance º¯¼ö ¿µ¿ª¿¡ ¼±¾ðÇØ µÐ
reference µéÀº doGet(), doPost() ¸¦ ¼öÇàÇÏ¸é¼ °¢°¢ÀÇ ¿äûµéÀÌ µ¿½Ã¿¡ °øÀ¯ÇÏ°Ô µË´Ï´Ù.
¿¹¸¦ µé¾î, µÎ°³ÀÇ ¿äûÀÌ ¾à°£ÀÇ ½Ã°£Â÷¸¦ µÎ°í ºñ½ÁÇÑ ¼ø°£¿¡ doGet() ¾ÈÀ¸·Î µé¾î¿Ô´Ù°í
°¡Á¤ÇØ º¸°Ú½À´Ï´Ù.
A ¶ó´Â ¿äûÀÌ ¼øÂ÷ÀûÀ¸·Î (1), (2), (3) ±îÁö ¼öÇàÇßÀ» ¶§, B ¶ó´Â ¿äûÀÌ °ð¹Ù·Î doGet()
¾ÈÀ¸·Î µé¾î¿Ã ¼ö ÀÖ½À´Ï´Ù. B ¿ª½Ã (1), (2), (3) À» ¼öÇàÇϰÚÁÒ...
ÀÌÁ¦ ¿äû A ´Â (4) ¹ø°ú (5) ¹øÀ» ¼öÇàÇÏ·Á Çϴµ¥, °¡¸¸È÷ »ý°¢ÇØ º¸¸é, ¿äûB ·Î ÀÎÇØ
¿äûA¿¡ ÀÇÇØ ÇÒ´çµÇ¾ú´ø conn, stmt, rs ÀÇ reference µéÀº ¹Ù²î¾î ¹ö·È½À´Ï´Ù.
°á±¹, ¿äû A ´Â ¿äû B ÀÇ °á°ú¸¦ °¡Áö°í ÀÛ¾÷À» ÇÏ°Ô µË´Ï´Ù. ¹Ý¸é, ¿äû B ´Â
¿äû A ÀÇ ÀÇÇØ rs.next() ¸¦ ÀÌ¹Ì ¼öÇà ÇØ ¹ö·ÈÀ¸¹Ç·Î, rs.next() ÀÇ °á°ú°¡ ÀÌ¹Ì close
µÇ¾ú´Ù´Â ¾û¶×ÇÑ °á°ú¸¦ ³º°í ¸¶´Â °ÅÁÒ...
´Ù¸¥ ½¬¿î ¾ê±â·Î ¼³¸íÇØ º¸¸é, A, B µÎ»ç¶÷ÀÌ ½ÄŹ¿¡ ¾É¾Æ¼ °¢ÀÚ ÀÚ½ÅÀÌ ÁغñÇØ ¿Â »ç°ú¸¦
Çϳª¾¿ ±ð¾Æ¼ ½ÄŹ À§ÀÇ Á¢½Ã¿¡ ¿Ã·Á ³õ°í ³ªÁß¿¡ ¸Ô¾î·Á ÇÏ´Â °Í°ú µ¿ÀÏÇÕ´Ï´Ù. A ¶ó´Â
»ç¶÷ÀÌ ¿½ÉÈ÷ »ç°ú¸¦ ±ð¾Æ Á¢½Ã¿¡ ´ã¾ÆµÑ ¶§, B ¶ó´Â »ç¶÷ÀÌ µé¾î¿Í¼ A°¡ ±ð¾ÆµÐ »ç°ú¸¦
¹ö¸®°í ÀÚ½ÅÀÌ ±ðÀº »ç°ú¸¦ ´ë½Å Á¢½Ã¿¡ ´ã¾Æ µÓ´Ï´Ù. ÀÌÁ¦ A¶ó´Â »ç¶÷Àº ÀÚ½ÅÀÌ ±ð¾Æ¼
´ã¾Æ µÎ¾ú´Ù°í »ý°¢ÇÏ´Â ±× »ç°ú¸¦ Á¢½Ã¿¡¼ ¸Ô¾î¹ö¸³´Ï´Ù. °ðÀ̾î B¶ó´Â »ç¶÷ÀÌ ÀÚ½ÅÀÇ
»ç°ú¸¦ Á¢½Ã¿¡¼ ¸Ô¾î·Á ÇÏ´Ï ÀÌ¹Ì A °¡ ¸Ô°í ³ ÈÄ ¿´½À´Ï´Ù. ÀÌ´Â Á¢½Ã¸¦ µÎ »ç¶÷ÀÌ
°øÀ¯Çϱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â ¹®Á¦ÀݽÀ´Ï±î.
¸¶Âù°¡Áö·Î ¼ºí·¿ÀÇ °¢ Thread´Â instance variable ¸¦ °øÀ¯Çϱ⠶§¹®¿¡ µ¿ÀÏÇÑ ¹®Á¦µéÀ»
¹ß»ýÇÏ°Ô µË´Ï´Ù.
µû¶ó¼ ÃÖ¼ÒÇÑ ´ÙÀ½Ã³·³ °íÃÄÁ®¾ß ÇÕ´Ï´Ù.
public class TestServlet extends HttpServlet {
private final static String drv = "...";
private final static String url = "....";
private final static String user = "...";
private final static String password = "...";
private ServletContext context;
public void init(ServletConfig config) throws ServletException {
super.init(config);
context = config.getServletContext();
try {
Class.forName(drv);
}
catch (ClassNotFoundException e) {
throw new ServletException("Unable to load JDBC driver:"+ e.toString());
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Connection conn = null; <----- À̰÷À¸·Î ¿Í¾ßÁÒ..
Statement stmt = null; <-------
ResultSet rs = null; <---------
String id = req.getParameter("id");
conn = DriverManager.getConnection(url,user,password);
stmt = conn.createStatement();
rs = stmt.executeQuery("select ..... where id = '" + id + "'");
while(rs.next()) {
......
}
rs.close();
stmt.close();
conn.close();
.....
}
}
1.4 JSP¿¡¼ Instance Variable °øÀ¯
JSP¿¡¼ ¾Æ·¡Ã³·³ »ç¿ëÇÏ´Â °æ¿ì°¡ À§ÀÇ °æ¿ì¿Í µ¿ÀÏÇÑ instance º¯¼ö¸¦ °øÀ¯ÇÏ´Â °æ¿ì°¡
µË´Ï´Ù.
---------------------------------------------------------
<%@ page session=.... import=.... contentType=........ %>
<%!
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String userid = null;
%>
<html><head></head><body>
<%
........
conn = ...
stmt = .....
uesrid = ......
%>
</body></html>
---------------------------------------------------------
¸¶Âù°¡Áö·Î À§Çèõ¸¸ÇÑ ÀÏÀ̸ç, ¿©·¯ Thread ¿¡ ÀÇÇØ ±× °ªÀÌ º¯ÇÒ ¼ö ÀÖ´Â º¯¼öµéÀº
<%! ... %> ¸¦ ÀÌ¿ëÇÏ¿© ¼±¾ðÇÏ½Ã¸é ¾ÈµË´Ï´Ù. ÀÌó·³ instance º¯¼ö·Î »ç¿ëÇÒ °ÍÀº
´ÙÀ½ ó·³, ±× °ªÀÌ º¯ÇÏÁö ¾Ê´Â °ªÀ̰ųª, ȤÀº °øÀ¯º¯¼ö¿¡ ´ëÇÑ Æ¯º°ÇÑ °ü¸®¸¦
ÇϽŠ»óÅ¿¡¼ ÇÏ¼Å¾ß ÇÕ´Ï´Ù.
<%! private static final String USERID = "scott";
private static final String PASSWORD = "tiger";
%>
JSP¿¡¼ÀÇ ÀÌ¿Í °°Àº À߸øµÈ À¯Çüµµ, ¾Õ¼± ¼ºí·¿ÀÇ °æ¿ìó·³ ÀϺΠ±¹³» JSP°ü·Ã
¼Àû¿¡¼ ¹ß°ßµË´Ï´Ù. ÇØ´ç ¼ÀûÀÇ ÀúÀÚ´Â °¡´ÉÇÑ »¡¸® °³Á¤ÆÇÀ» ³»¼Å¼ ½ÃÁ¤Çϼžß
ÇÒ °ÍÀÔ´Ï´Ù. ÇØ´ç Ã¥Àº ÃâÆÇ»ç³ª Ã¥ÀÇ À¯Çü, ±×¸®°í ±ÛÀÚü·Î ÃßÁ¤°Çµ¥, Ãʺ¸ÀÚ°¡
½±°Ô ¼±ÅÃÇÒ ¹ýÇÑ Ã¥ÀÎ ¸¸Å ±× ÆÄ±Þ·Â°ú ¿µÇâ·ÂÀÌ ³Ê¹« Å« µí ÇÕ´Ï´Ù.
ÀÌ¿Í °°Àº ºÎºÐÀÌ ½Ç ÇÁ·ÎÁ§Æ®¿¡¼ Á¸ÀçÇÒ °æ¿ì, ´ëºÎºÐ ½Ã½ºÅÛ ¿ÀÇ ù³¯ Âë¿¡
¹®Á¦¸¦ ÀνÄÇÏ°Ô µË´Ï´Ù. Connection reference °¡ ¾þ¾îÃÄÁö¹Ç·Î Pool ¿¡ ¹ÝȯÀÌ
ÀϾÁö ¾Ê°Ô µÇ°í, ÀÌ´Â "connection pool"ÀÇ °¡¿ëÇÑ ÀÚ¿øÀÌ ºÎÇϰ¡ ¾ó¸¶ ¾øÀ½¿¡µµ
ºÒ±¸ÇÏ°í ¸ðÀÚ¶ó´Â Çö»óÀ¸·Î ³ªÅ¸³ª¸ç, ¶§·Ð »ç¿ëÀÚÀÇ È¸é¿¡¼´Â ¾û¶×ÇÑ ´Ù¸¥
»ç¶÷ÀÇ µ¥ÀÌŸ°¡ ³ªÅ¸³ª°Å³ª, SQLException ÀÌ ³ªÅ¸³³´Ï´Ù.
NOTE: ¾î¶»°ÔÇ϶õ ¸»ÀԴϱî? °¢ È£Ãâ°£¿¡ °øÀ¯µÇ¾î¼´Â ¾ÈµÉ º¯¼öµéÀº <%! ...%> °¡
¾Æ´Ï¶ó, <% ... %> ³»¿¡¼ ¼±¾ðÇÏ¿© »ç¿ëÇ϶õ ¾ê±é´Ï´Ù. JSP°¡ Pre-compileµÇ¾î
ServletÇüÅ·Πº¯È¯µÉ ¶§, <%! ... %>´Â ¼ºí·¿ÀÇ instance variable·Î ±¸¼ºµÇ´Â ¹Ý¸é,
<% ... %>´Â _jspService() ¸Þ¼Òµå ³»ÀÇ method variable·Î ±¸¼ºµË´Ï´Ù.
2. ÇϳªÀÇ 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) DB ÀÚ¿øÀÇ ³¶ºñ
À§ÀÇ ±¸Á¶´Â ¼ºí·¿´ç Çϳª¾¿ 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 Á¦ÇÑÀÌ ÀÖ½À´Ï´Ù. Oracle ÀÇ °æ¿ì Default´Â 50
ÀÔ´Ï´Ù. ¸¸¾à ÀÌ ¼öÄ¡ ÀÌ»óÀ» µ¿½Ã¿¡ Open ÇÏ·Á°í Çϸé "maximum open cursor exceed !"
ȤÀº "Limit on number of statements exceeded"¶ó´Â 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; <---------
.....
}
3. Exception ÀÌ ¹ß»ýÇßÀ» ¶§µµ Connection Àº ´ÝÇô¾ß ÇÑ´Ù !!
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
String id = req.getParameter("id");
Connection conn = DriverManager.getConnection("url...","id","password");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("ssselect * from XXX where id = '" + id + "'");
while(rs.next()) {
......
}
rs.close();
stmt.close();
conn.close();
.....
}
À§¿¡¼± ¹¹°¡ À߸øµÇ¾úÀ»±î¿ä? ³×, »ç½Ç Ưº°È÷ À߸øµÈ °Í ¾ø½À´Ï´Ù. ´ÜÁö SQL¹®Àå¿¡ ¿ÀŸ°¡
ÀÖ´Ù´Â °ÍÀ» Á¦¿ÜÇϰï.... ±Ùµ¥, °ú¿¬ ±×·²±î¿ä?
SQLException À̶ó´Â °ÍÀº Runtime ½Ã¿¡ ¹ß»ýÇÕ´Ï´Ù. DB ÀÇ Á¶°ÇÀÌ ¸ÂÁö ¾Ê´Â´Ù°Å³ª
°³¹ß±â°£ Áß¿¡ °³¹ßÀÚÀÇ ½Ç¼ö·Î SQL¹®Àå¿¡ À§Ã³·³ ¿ÀŸ¸¦ ÀûÀ» ¼öµµ ÀÖÁÒ.
¹®Á¦´Â Exception ÀÌ ¹ß»ýÇÏ¸é ¸¶Áö¸· ¶óÀεé Áï, rs.close(), stmt.close(), conn.close()
°¡ ¼öÇàµÇÁö ¾Ê´Â´Ù´Â °ÍÀÔ´Ï´Ù.
java.sql.Connection Àº reference ¸¦ ÀÒ´õ¶óµµ JVM(Java Virtual Machine)ÀÇ GC(Garbage
Collection) ´ë»óÀÌ ¾Æ´Õ´Ï´Ù. °¡¶àÀ̳ª ¸ðÀÚ¶ó´Â "DB¿¬°áÀÚ¿ø"À» ƯÁ¤ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ
Á¡À¯ÇÏ°í ³õ¾Æ ÁÖÁö ¾Ê±â ¶§¹®¿¡ ¾ó¸¶¾È°¡ DB Connection À» ´õÀÌ»ó ¿¬°áÇÏÁö ¸øÇÏ´Â
»çŰ¡ ¹ß»ýÇÕ´Ï´Ù.
µû¶ó¼ ´ÙÀ½Ã³·³ Exception ÀÌ ¹ß»ýÇÏµç ¹ß»ýÇÏÁö ¾Êµç ¹Ýµå½Ã java.sql.Connection À»
close() ÇÏ´Â ·ÎÁ÷ÀÌ ²À(!) µé¾î°¡¾ß ÇÕ´Ï´Ù.
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String id = req.getParameter("id");
try {
conn = DriverManager.getConnection("url...","id","password");
stmt = conn.createStatement();
rs = stmt.executeQuery("sselect * from XXX where id = '" + id + "'");
while(rs.next()) {
......
}
rs.close();
stmt.close();
}
finally {
if ( conn != null ) try {conn.close();}catch(Exception e){}
}
.....
}
Âü°í·Î, ½ÇÇÁ·ÎÁ§Æ®ÀÇ Áø´Ü ¹× Æ©´×À» ³ª°¡º¸¸é óÀ½¿¡´Â ÀûÀýÇÑ ÀÀ´ä¼Óµµ°¡ ³ª¿À´Ù°¡
ÀÏÁ¤ÇÑ È½¼ö ÀÌ»óÀ» È£ÃâÇÏ°í ³ µÚºÎÅÍ ¾öû ÀÀ´ä½Ã°£ÀÌ ´À·ÁÁø´Ù¸é, ½ÊÁßÆÈ±¸´Â À§Ã³·³
java.sql.Connection À» ´ÝÁö ¾Ê¾Æ¼ »ý±â´Â ¹®Á¦ÀÔ´Ï´Ù.
°¡¿ëÇÑ ¸ðµç Connection À» ¿¬°áÇÏ¿© ´õÀÌ»ó ¿¬°á½Ãų Connection ÀÚ¿øÀ» ÇÒ´çÇÒ ¼ö ¾øÀ»
¶§, ´ëºÎºÐ timewait ÀÌ °É¸®±â ¶§¹®ÀÔ´Ï´Ù. ÀÏ´Ü DB°ü·ÃÇÑ ÀÛ¾÷ÀÌ µé¾î¿À´Â Á·Á·
timewait¿¡ ºüÁú °æ¿ì, "¾îÇø®ÄÉÀ̼Ǽ¹ö"¿¡¼ µ¿½Ã¿¡ ó¸®ÇÒ ¼ö ÀÖ´Â ÃÖ´ë °¹¼ö¸¸Å
È£ÃâÀÌ Â÷°îÂ÷°î ½×ÀÌ´Â °Ç ºÒ°ú ¸îºÐ °É¸®Áö ¾Ê½À´Ï´Ù. ±× µÚºÎÅÍ´Â ¾Ö±ÄÀº dummy.jsp
Á¶Â÷ È£ÃâÀÌ µÇÁö ¾Ê°Ô µÇ°í, ´©±º°¡´Â "½Ã½ºÅÛ ¶Ç Á×¾ú³×¿ä"¶ó¸ç ¹¦ÇÑ ¿ôÀ½À» Áþ°ï
ÇϰÚÁÒ....
4. Connection »Ó¸¸ ¾Æ´Ï¶ó Statement, ResultSet µµ ¹Ýµå½Ã ´ÝÇô¾ß ÇÑ´Ù !!
4.1 3¹øÀÇ ¿¹Á¦¿¡¼ Connection ÀÇ close() ¸¸ °í·ÁÇÏ¿´Áö Statement ³ª ResultSet ¿¡ ´ëÇÑ
close´Â ÀüÇô °í·Á ÇÏÁö ¾Ê°í ÀÖ½À´Ï´Ù. ¹«½¼ ¹®Á¦°¡ ÀÖÀ»±î¿ä? Statement ¸¦ ´ÝÁö ¾Ê¾Æµµ
Connection À» ´Ý¾ÒÀ¸´Ï Statement ³ª ResultSet Àº ÀÚµ¿À¸·Î µû¶ó¼ ´ÝÈ÷´Â °Í ¾Æ´Ï³Ä±¸¿ä?
õ¸¸ÀÇ ¸»¾¸, ¸¸¸¸ÀÇ Äá±ðÁöÀÔ´Ï´Ù.
¸¸¾à, DB Connection Pooling À» »ç¿ëÇÏÁö ¾Ê°í Á÷Á¢ JDBC Driver ¸¦ ÀÌ¿ëÇÏ¿© ¸Å¹ø DB
¿¬°áÀ» ÇÏ¿´´Ù°¡ ²÷´Â ±¸Á¶¶ó¸é ¹®Á¦°¡ ¾ø½À´Ï´Ù.
±×·¯³ª DB Connection Pooling Àº ÀÌÁ¨ º¸ÆíÈµÇ¾î ´©±¸³ª DB Connection Pooling À» »ç¿ë
ÇØ¾ßÇÑ´Ù´Â °ÍÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ±×°ÍÀÌ ¾îÇø®ÄÉÀÌ¼Ç ¼¹ö°¡ Á¦°øÇØ ÁÖµç, ȤÀº ÀÛÀº
¼ºí·¿¿£Áø¿¡¼ ¿î¿µÇϰí ÀÖ´Ù¸é Á÷Á¢ ¸¸µé°Å³ª, ÀÎÅͳÝÀ¸·Î µ¹¾Æ´Ù´Ï´Â ³²ÀÇ ¼Ò½º¸¦ °¡Á®´Ù
»ç¿ëÇϰí ÀÖÀ» °Ì´Ï´Ù.
ÀÌó·³ DB Connection Pooling À» »ç¿ëÇϰí ÀÖÀ» °æ¿ì´Â Conneciton ÀÌ ½ÇÁ¦ close()µÇ´Â
°ÍÀÌ ¾Æ´Ï¶ó Pool¿¡ ¹ÝȯµÇ¾î Áö°Ô µÇ´Âµ¥, °á±¹ reference°¡ »ç¸®ÁöÁö ¾Ê±â ¶§¹®¿¡ GC½ÃÁ¡¿¡
ÀÚµ¿ closeµÇÁö ¾Ê°Ô µË´Ï´Ù.
ƯÁ¤ Connection ¿¡¼ ¿¾îµÐ Statement ¸¦ close() ÇÏÁö ¾ÊÀºÃ¤ ±×³É ¹Ýȯ½ÃÄÑ ³õ°Ô µÇ¸é,
¾ðÁ¨°¡´Â ±× Connection Àº ´ÙÀ½°ú °°Àº SQLException À» ¾ß±âÇÒ °¡´É¼ºÀ» ³»Æ÷ÇÏ°Ô µË´Ï´Ù.
Oracle :
java.sql.SQLException : ORA-01000: maximum open cursor exceeded !!
(Ãִ뿱â Ä¿¼¼ö¸¦ ÃʰúÇß½À´Ï´Ù)
UDB DB2 :
COM.ibm.db2.jdbc.DB2Exception: [IBM][JDBC µå¶óÀ̹ö] CLI0601E À¯È¿ÇÏÁö ¾ÊÀº
¸í·É¹® ÇÚµé ¶Ç´Â ¸í·É¹®ÀÌ ´ÝÇû½À´Ï´Ù. SQLSTATE=S1000
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0129E ÇÚµé(handle)ÀÌ
´õÀÌ»ó ¾ø½À´Ï´Ù. SQLSTATE=HY014
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0954C ÀÀ¿ëÇÁ·Î±×·¥
Èü(heap)¿¡ ¸í·É¹®À» ó¸®Çϱâ À§ÇØ »ç¿ë °¡´ÉÇÑ ÀúÀ念¿ªÀÌ ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù.
SQLSTATE=57011
ÀÌÀ¯´Â ¾Õ 2)¹ø±Û¿¡¼ ÀÌ¹Ì ¾ð±Þµå·È½À´Ï´Ù. º¸´Ù ÀÚ¼¼ÇÑ ±â¼úÀû ³»¿ëÀº ¾Æ·¡ÀÇ ±ÛÀ»
Âü°íÇϼ¼¿ä.
Connection/Statement ÃÖ´ë µ¿½Ã Open ¼ö
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=jdbc&c=r_p&n=972287002
µû¶ó¼ ¶Ç´Ù½Ã 3¹øÀÇ ¼Ò½º´Â ´ÙÀ½°ú °°Àº À¯ÇüÀ¸·Î °íÃÄÁ®¾ß ÇÕ´Ï´Ù.
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String id = req.getParameter("id");
try {
conn = ...<getConnection()>...; // (ÆíÀÇ»ó »ý·«ÇÕ´Ï´Ù.)
stmt = conn.createStatement();
rs = stmt.executeQuery("sselect * from XXX where id = '" + id + "'");
while(rs.next()) {
......
}
// rs.close();
// stmt.close();
}
finally {
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( stmt != null ) try {stmt.close();}catch(Exception e){} // <-- !!!!
if ( conn != null ) ...<releaseConnection()>...; // (ÆíÀÇ»ó »ý·«)
}
.....
}
4.2 »ç½Ç À§¿Í °°Àº ±¸Á¶¿¡¼, java.sql.StatementÀÇ Äõ¸®¿¡ ÀÇÇÑ ResultSetÀÇ close()¿¡
´ëÇÑ °ÍÀº ±×¸® Áß¿äÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. ResultSetÀº Statement °¡ close() µÉ ¶§ ÇÔ²²
ÀÚ¿øÀÌ ÇØÁ¦µË´Ï´Ù. µû¶ó¼ ´ÙÀ½°ú °°ÀÌ Çϼŵµ µË´Ï´Ù.
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, SQLException
{
Connection conn = null;
Statement stmt = null;
String id = req.getParameter("id");
try {
conn = ...<getConnection()>...;
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("sselect * from XXX where id = '" + id + "'");
while(rs.next()) {
......
}
rs.close(); //<--- !!!
}
finally {
// if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( stmt != null ) try {stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
.....
}
4.3 °¡Àå ´ëÇ¥ÀûÀ¸·Î À߸ø ÇÁ·Î±×·¡¹ÖÇϰí ÀÖ´Â ¿¹¸¦ µé¶ó¸é ´ÙÀ½°ú °°Àº À¯ÇüÀÔ´Ï´Ù.
Connection conn = null;
try {
conn = ...<getConnection()>....;
Statement stmt = conn.createStatement();
stmt.executeUpdate("...."); <--- ¿©±â¼ SQLException ÀÌ ÀϾ¸é...
.....
.....
..... <-- ¸¸¾à,ÀÌÂë¿¡¼ NullPointerException ÀÌ ÀϾ¸é ?
.....
stmt.close(); <-- À̰ÍÀ» ŸÁö ¾ÊÀ½ !!!
}
finally{
if ( conn != null ) ...<releaseConnection()>...;
}
4.4 Statement °¡ close() µÇÁö ¾Ê´Â ¶Ç ÇϳªÀÇ °æ¿ì°¡ ´ÙÀ½°ú °°Àº °æ¿ìÀÔ´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try {
conn = .....
stmt = conn.createStatement(); // ....(1)
rs = stmt.executeQuery("select a from ...");
.....
rs.close();
stmt = conn.createStatement(); // ....(2)
rs = stmt.executeQuery("select b from ...");
....
}
finally{
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ....
}
Áï, µÎ¹ø stmt = conn.createStatement() ¸¦ ¼öÇàÇÔÀ¸·Î½á, ¸ÕÀú »ý¼ºµÈ stmt ´Â
(2)¹ø¿¡ ÀÇÇØ ±× reference °¡ ¾þ¾îÃĹö¸®°Ô µÇ¾î ¿µ¿øÈ÷ close() µÇÁö ¾ÊÀºÃ¤
³²¾Æ ÀÖ°Ô µË´Ï´Ù.
ÀÌ °æ¿ì, (2)¹ø ¹®ÀåÀ» ÁÖ¼®Ã³¸®ÇÏ¿©¾ß °ÚÁö¿ä. Çѹø »ý¼ºµÈ Statement ·Î ¿©·¯¹ø
Query ¸¦ ¼öÇàÇÏ¸é µË´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try {
conn = .....
stmt = conn.createStatement(); // ....(1)
rs = stmt.executeQuery("select a from ...");
.....
rs.close();
// stmt = conn.createStatement(); // <--- (2) !!!
rs = stmt.executeQuery("select b from ...");
....
}
finally{
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ....
}
4.5 Statement »Ó¸¸ ¾Æ´Ï¶ó PreparedStatement ¸¦ »ç¿ëÇÒ ¶§·Î ¸¶Âù°¡Áö ÀÔ´Ï´Ù.
....
PreparedStatement pstmt = conn.prepareStatement("select ....");
....
ÀÌ·¸°Ô ¸¸µé¾îÁø pstmt µµ ¹Ýµå½Ã pstmt.close() µÇ¾î¾ß ÇÕ´Ï´Ù.
¿¹¸¦ µé¸é, ´ÙÀ½°ú °°Àº Äڵ带 »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Connection conn = null;
try {
conn = ...<getConnection()>...;
PreparedStatement pstmt = conn.prepareStatement("select .... ?...?");
pstmt.setString(1,"xxxx");
pstmt.setString(2,"yyyy");
ResultSet rs = pstmt.executeQuery(); <--- ¿©±â¼ SQLException ÀÌ ÀϾ¸é
while(rs.next()){
....
}
rs.close();
pstmt.close(); <-- À̰ÍÀ» ŸÁö ¾ÊÀ½ !!!
}
finally{
if ( conn != null ) ...<releaseConnection()>...;
}
µû¶ó¼ °°Àº ¸Æ¶ôÀ¸·Î ´ÙÀ½°ú °°ÀÌ °íÃÄÁ®¾ß ÇÕ´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null; // <-------- !!
ResultSet rs = null;
try {
conn = ...<getConnection()>...;
pstmt = conn.prepareStatement("select .... ?...?");
pstmt.setString(1,"xxxx");
pstmt.setString(2,"yyyy");
rs = pstmt.executeQuery(); <--- ¿©±â¼ SQLException ÀÌ ÀϾ´õ¶óµµ...
while(rs.next()){
....
}
//rs.close();
//pstmt.close();
}
finally{
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( pstmt != null ) try {pstmt.close();}catch(Exception e){} // <-- !!!!
if ( conn != null ) ...<releaseConnection()>...;
}
4.6 PreparedStatement ¿¡ °ü·ÃÇØ¼ ´ÙÀ½°ú °°Àº °æ¿ìµµ »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.
4.6.1 ¾Õ¼ÀÇ 4.4¿¡¼ Statement¸¦ createStatement() ¿¬°ÅǪ µÎ¹ø »ý¼ºÇÏ´Â °Í°ú
µ¿ÀÏÇÏ°Ô PreparedStatement¿¡¼µµ ÁÖÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = .....
pstmt = conn.prepareStatement("select a from ..."); // ....(1)
rs = pstmt.executeQuery();
.....
rs.close();
pstmt = conn.prepareStatement("select b from ..."); // <--- (2) !!!
rs = pstmt.executeQuery();
....
}
finally{
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( pstmt != null ) try{pstmt.close();}catch(Exception e){} // <--- (3)
if ( conn != null ) ...<releaseConnection()>...;
}
StatementÀÇ ÀνºÅϽº´Â conn.createStatement() ½Ã¿¡ ÇÒ´çµÇ¾î Áö´Â ¹Ý¸é,
PreparedStatement´Â conn.prepareStatement("..."); ½Ã¿¡ ÇÒ´çµÇ¾î Áý´Ï´Ù. À§ÀÇ °æ¿ì¿¡¼
¼³·É ¸¶Áö¸· finally Àý¿¡¼ pstmt.close() ¸¦ Çϰí ÀÖ±â´Â ÇÏÁö¸¸, (1)¹ø¿¡¼ ÇÒ´çµÇ¾îÁø
pstmt ´Â (2)¿¡¼ ¾þ¾îÃÆ±â ¶§¹®¿¡ ¿µ¿øÈ÷ close() µÇÁö ¾Ê°Ô µË´Ï´Ù. µû¶ó¼, ´ÙÀ½°ú
°°ÀÌ ÄÚµùµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀº ÀÚ¸íÇÕ´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = .....
pstmt = conn.prepareStatement("select a from ..."); // ....(1)
rs = pstmt.executeQuery();
.....
rs.close();
pstmt.close(); // <------- !!!!! ÀÌó·³ ¿©±â¼ ¸ÕÀú close() ÇØ¾ßÁö¿ä.
pstmt = conn.prepareStatement("select b from ..."); // <--- (2)
rs = pstmt.executeQuery();
....
}
finally{
if ( rs != null ) try {rs.close();}catch(Exception e){}
if ( pstmt != null ) try{pstmt.close();}catch(Exception e){} // <--- (3)
if ( conn != null ) ...<releaseConnection()>...;
}
ȤÀº ´ÙÀ½°ú °°ÀÌ ¼·Î ´Ù¸¥ µÎ°³ÀÇ PreparedStatement¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt1 = null;
ResultSet rs1 = null;
PreparedStatement pstmt2 = null;
ResultSet rs2 = null;
try {
conn = .....
pstmt1 = conn.prepareStatement("select a from ..."); // ....(1)
rs1 = pstmt1.executeQuery();
.....
pstmt2 = conn.prepareStatement("select b from ..."); // <--- (2)
rs2 = pstmt2.executeQuery();
....
}
finally{
if ( rs1 != null ) try {rs1.close();}catch(Exception e){}
if ( pstmt1 != null ) try{pstmt1.close();}catch(Exception e){} // <--- (3)
if ( rs2 != null ) try {rs2.close();}catch(Exception e){}
if ( pstmt2 != null ) try{pstmt2.close();}catch(Exception e){} // <--- (4)
if ( conn != null ) ...<releaseConnection()>...;
}
4.6.2 ¾Æ·¡´Â ¾Õ¼ÀÇ 4.6.1°ú °°Àº ¸Æ¶ôÀε¥, for loop ¾È¿¡¼ »ç¿ëµÈ °æ¿ìÀÔ´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ...<getConnection()>...;
for(int i=0;i<10;i++){
pstmt = conn.prepareStatement("update .... ?... where id = ?"); //... (1)
pstmt.setString(1,"xxxx");
pstmt.setString(2,"id"+(i+1) );
int affected = pstmt.executeUpdate();
if ( affected == 0 ) throw new Exception("NoAffected");
else if ( affedted > 1 ) throw new Exception("TooManyAffected");
}
}
finally{
if ( pstmt != null ) try {pstmt.close();}catch(Exception e){} // ...(2)
if ( conn != null ) ...<releaseConnection()>...;
}
ÀÌ °æ¿ì°¡ ½ÇÁ¦ ÇÁ·ÎÁ§Æ® performace Æ©´×À» °¡ º¸¸é Á¾Á¾ ¹ß°ßµÇ´Â À߸øµÈ
À¯Çü ÁßÀÇ ÇϳªÀÔ´Ï´Ù. ÇÙ½ÉÀº pstmt.prepareStatement("update..."); ¹®ÀåÀ»
¼öÇàÇÒ ¶§ ¸¶´Ù ³»ºÎÀûÀ¸·Î pstmt °¡ »õ·Î ÇÒ´çµÈ´Ù´Â °Í¿¡ ÀÖ½À´Ï´Ù.
°á±¹, (1)¹ø ¹®ÀåÀÌ for loop À» µ¹¸é¼ 9°³´Â pstmt.close()°¡ µÇÁö ¾Ê°í, ¸¶Áö¸·
ÇϳªÀÇ pstmt ¸¸ finally ÀýÀÇ (2)¹ø¿¡¼ close µÇÁö¿ä...
µû¶ó¼ ´ÙÀ½Ã³·³ °íÃÄÁ®¾ß ÇÕ´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ...<getConnection()>...;
pstmt = conn.prepareStatement("update .... ?... where id = ?");
for(int i=0;i<10;i++){
pstmt.clearParameters();
pstmt.setString(1,"xxxx");
pstmt.setString(2,"id"+(i+1) );
int affected = pstmt.executeUpdate();
if ( affected == 0 ) throw new Exception("NoAffected");
else if ( affedted > 1 ) throw new Exception("TooManyAffected");
}
}
finally{
if ( pstmt != null ) try {pstmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
PreparedStatement ¶ó´Â °ÍÀÌ, Çѹø ÆÄ½ÌÇÏ¿© µ¿ÀÏÇÑ SQL¹®ÀåÀ» °ð¹Ù·Î ExecutionÇÒ ¼ö
ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ´Â °ÍÀ̰í, ±Ã±ØÀûÀ¸·Î À§¿Í °°Àº °æ¿ì¿¡ È¿°ú¸¦ ±Ø´ëÈ ÇÒ ¼ö ÀÖ´Â
°ÍÀÌÁö¿ä.
¾î´À °³¹ßÀÚÀÇ ¼Ò½º¿¡¼´Â À§ÀÇ °æ¿ì¸¦ ´ÙÀ½°ú °°ÀÌ for loop ¾È¿¡¼ ¸Å¹ø
conn.prepareStatement(...)¸¦ ÇÏ´Â °æ¿ì¸¦ º¸¾Ò½À´Ï´Ù.
Connection conn = null;
try {
conn = ...<getConnection()>...;
for(int i=0;i<10;i++) {
PreparedStatement pstmt = null;
try{
pstmt = conn.prepareStatement("update .... ?... where id = ?");
pstmt.clearParameters();
pstmt.setString(1,"xxxx");
pstmt.setString(2,"id"+(i+1) );
int affected = pstmt.executeUpdate();
if ( affected == 0 ) throw new Exception("NoAffected");
else if ( affedted > 1 ) throw new Exception("TooManyAffected");
}
finally{
if ( pstmt != null ) try {pstmt.close();}catch(Exception e){}
}
}
}
finally{
if ( conn != null ) ...<releaseConnection()>...;
}
À§ °æ¿ì´Â Àå¾Ö°üÁ¡¿¡¼ º¸¸é »ç½Ç º° ¹®Á¦´Â ¾ø½À´Ï´Ù. Àû¾îµµ ´ÝÀ» °Ç ¸ðµÎ Àß ´Ý°í
ÀÖÀ¸´Ï±î¿ä. ´ÜÁö È¿À²¼ºÀÇ ¹®Á¦°¡ ´ëµÎµÉ ¼ö ÀÖÀ» »ÓÀÔ´Ï´Ù.
4.7 »ý°¢ÇØ º¸¸é, Statement ³ª PreparedStatement °¡ close() µÇÁö ¾Ê´Â À¯ÇüÀº
¿©·¯°¡Áö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª ¿·ÁÁø Statement´Â ¹Ýµå½Ã close()µÇ¾î¾ß ÇÑ´Ù¶ó´Â
´Ü¼øÇÑ »ç½Ç¿¡ Á¶±Ý¸¸ ½Å°æ¾²½Ã¸é ¾î¶»°Ô ÇÁ·Î±×·¡¹ÖÀÌ µÇ¾î¾ß ÇÏ´ÂÁö ½±°Ô
°¨ÀÌ ¿À½Ç °Ì´Ï´Ù. ´ÜÁö ½Å°æÀ» ¾È¾²½Ã´Ï ¹®Á¦°¡ µÇ´Â °ÍÀÌÁö¿ä...
Statement ¸¦ ´ÝÁö ¾Ê´Â ½Ç¼ö¸¦ ÇÑ Äڵ尡 400-1000¿©°³ÀÇ Àü ¾îÇø®ÄÉÀ̼ÇÀ» ÅëÅоî
Çѵαºµ¥¿¡ ¼û¾î ÀÖ´Â °æ¿ì°¡ Á¦ÀÏ Ã£¾Æ³»±â ¾î·Æ½À´Ï´Ù. Çѵιø Statement ¸¦
close ÇÏÁö ¾Ê´Â´Ù°í ÇÏ¿© °ð¹Ù·Î ¹®Á¦·Î ³ªÅ¸³ªÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.
ÇϷ糪 ÀÌÆ², ȤÀº ¸çÄ¥Áö³ª¼¾ß, Oracle ÀÇ °æ¿ì, "maximum open cursor exceed"
¿¡·¯¸¦ ³»°Ô µË´Ï´Ù. oracle ÀÇ °æ¿ì, À§¿Í °°Àº ¿¡·¯¸¦ conn.createStatement()½Ã¿¡
¹ß»ýÇϹǷΠ(°æ¿ì¿¡ µû¶ó) Å« ¹®Á¦·Î À̾îÁöÁö´Â ¾Ê½À´Ï´Ù. ã¾Æ¼ °íÄ¡¸é µÇ´Ï±î¿ä.
¹Ý¸é, DB2 ÀÇ °æ¿ì´Â ¸Þ¸ð¸®°¡ Çã¿ëÇÏ´Â Çѵµ±îÁö Áö¼ÓÀûÀÎ ¸Þ¸ð¸® Áõ°¡¸¦ ¾ß±âÇÕ´Ï´Ù.
±Þ±â¾ß "ÇÚµé(handle)ÀÌ ´õÀÌ»ó ¾ø½À´Ï´Ù", "ÀÀ¿ëÇÁ·Î±×·¥ Èü(heap)¿¡ ¸í·É¹®À»
ó¸®Çϱâ À§ÇØ »ç¿ë °¡´ÉÇÑ ÀúÀ念¿ªÀÌ ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù", "À¯È¿ÇÏÁö ¾ÊÀº ¸í·É¹®
ÇÚµé ¶Ç´Â ¸í·É¹®ÀÌ ´ÝÇû½À´Ï´Ù" µî°ú °°Àº ¿¡·¯¸¦ ³»Áö¸¸, ¿©±â¼ ±×Ä¡´Â °ÍÀÌ ¾Æ´Ï¶ó
»õ·Î¿î connection À» ¸Î´Â ½ÃÁ¡¿¡ SIGSEGV ¸¦ ³»¸é crashing ÀÌ ÀϾ´Ï´Ù.
java.lang.OutOfMemoryError °¡ ¹ß»ýÇϱ⠶§¹®ÀÌÁö¿ä.
Oracle ÀÇ °æ¿ìµµ »ç½Ç »óȲ¿¡ µû¶ó ½É°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¾î¶² °³¹ßÀÚ°¡
"maximum open cursor exceed"¶ó´Â Oracle SQL ¿¡·¯ ¸Þ¼¼Áö¸¦ ¸¸³ª°í´Â ÀÚ½ÅÀÌ
ÄÚµùÀ» À߸øÇÑ °ÍÀº ¿°µÎ¿¡ µÎÁö ¾Ê°í, ¹«Á¶°Ç DBA¿¡°Ô oraXXX.ini ÆÄÀÏ¿¡¼
OPEN_CURSORS °ªÀ» ¿Ã·Á´Þ¶ó°í ¿äûÇϰí, DBA´Â ±× Á¶¾ð(?)À» Ãæ½ÇÈ÷ ¹Þ¾Æµé¿©
Default 50 ¿¡¼ À̸¦ 3000 À¸·Î Á¶Á¤ÇÕ´Ï´Ù. ¿©±â¼ ¹®Á¦´Â ±í¼÷È÷(?) ¼û°ÜÁý´Ï´Ù.
close() ¾ÈµÈ Statement °¡ 3000 ȸ¿¡ µµ´ÞÇÏÁö Àü±îÁø ¾Æ¹«µµ ¹®Á¦¸¦ ÀνÄÇÏÁö
¸øÇϱ⠶§¹®ÀÌÁÒ. ±×·¯³ª, Statement°¡ Çϳª¾¿ close()µÇÁö ¾ÊÀº °¹¼ö¿¡ ºñ·ÊÇÏ¿©
Oracle ¿£ÁøÀÇ ¸Þ¸ð¸® »ç¿ëÀº ÀÚ²Ù¸¸ Áõ°¡Çϰí, ÀüüÀûÀÎ ¼º´ÉÀúÇϸ¦ ¾ß±âÇÏÁö¸¸,
À̸¦ ÀνÄÇϱâ¶õ ¸·»ó ½Ã½ºÅÛÀ» ¿ÀÇÂÇÏ°í ³ª¼ 3-4ÀÏÀÌ Áö³ ÈÄ¿¡ "DB¼º´ÉÀÌ ÀÌ»óÇϳ×,
ÀÀ´ä¼Óµµ°¡ ´À¸®³×" ÇÏ¸é¼ ¶Ç ÇѹøÀÇ "maximum open cursor exceed" ¸Þ¼¼Áö¸¦
È®ÀÎÇÏ°í ³ µÚÀÇ ÀÏÀÌ µÇ°ï ÇÕ´Ï´Ù.
¿¡·¯°¡ ¾ø´Â Á¤»óÀûÀÎ ·ÎÁ÷ flow ¿¡¼´Â ´ëºÎºÐ Statement°¡ Àß ´ÝÈú °Ì´Ï´Ù. ±×·¯³ª,
¾î¶² ÀÌÀ¯¿¡¼°Ç ¾ÆÁÖ µå¹°°Ô Runtime Exception ÀÌ ¹ß»ýÇÏ¿© exception throwingÀ¸·Î
ÀÎÇØ "stmt.close()"¸¦ ŸÁö ¾Ê´Â °æ¿ì°¡ Á¦ÀÏ ¹«¼·Áö¿ä. Á¤¸» ¹«¼·Áö¿ä...
Statement, PreparedStatement, CallableStatement ¸ðµÎ ¸¶Âù°¡Áö ÀÔ´Ï´Ù.
5. close() ¸¦ ÇÒ ¶© Á¦´ë·Î ÇØ¾ß ÇÑ´Ù!!
5.1 ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥ Çü½ÄÀ» »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = ...<getConnection()>...; //.......(1)
stmt = conn.createStatement(); //.............(2)
rs = stmt.executeQuery("select ....."); // .....(3)
while(rs.next()){
......
}
}
finally {
try {
rs.close(); //........(4)
stmt.close(); //......(5)
...<releaseConneciton()>...; //......(6)
}catch(Exception e){}
}
À§¿¡¼± ¹¹°¡ À߸øµÇ¾úÀ»±î¿ä? ´Ù Á¦´ë·Î Çѵí Çѵ¥....
finally Àý¿¡¼ rs, stmt, conn À» null check ¾øÀÌ, ±×¸®°í µ¿ÀÏÇÑ try{}catch Àý·Î
½ÇÇàÇϰí ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, (1), (2) ¹øÀ» °ÅÄ¡¸é¼ conn °ú stmt °´Ã¼±îÁö´Â Á¦´ë·Î ¼öÇàµÇ¾úÀ¸³ª
(3)¹ø Query¹®ÀåÀ» ¼öÇàÇÏ´Â µµÁß¿¡ SQLException ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¸é,
finally Àý¿¡¼ (4) ¹ø rs.close()¸¦ ¼öÇàÇÏ·Á ÇÕ´Ï´Ù. ±×·¯³ª, executeQuery()°¡
½ÇÆÐ Ç߱⠶§¹®¿¡ rs ÀÇ reference ´Â null À̹ǷΠrs.close() ½Ã¿¡
NullPointerException ÀÌ ¹ß»ýÇÕ´Ï´Ù. °á±¹ Á¤ÀÛ ¹Ýµå½Ã ¼öÇàµÇ¾î¾ßÇÒ (5)¹ø, (6)¹øÀÌ
½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. µû¶ó¼ ¹Ýµå½Ã(!) ´ÙÀ½°ú °°Àº Çü½ÄÀÇ ÄÚµùÀÌ µÇ¾î¾ß ÇÕ´Ï´Ù.
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
rs = stmt.executeQuery("select .....");
while(rs.next()){
......
}
}
catch(Exception e){
....
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
°°Àº ¸Æ¶ôÀ¸·Î PreparedStatement ¸¦ »ç¿ëÇÒ °æ¿ìµµ, ´ÙÀ½°ú °°Àº ÄÚµùÀº À߸øµÇ¾ú½À´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
try{
conn = ...<getConnection()>...; //.......(1)
pstmt = conn.prepareStatement("ddelete from EMP where empno=7942"); //...(2)
int k = pstmt.executeUpdate(); // .....(3)
......
}
finally {
try {
pstmt.close(); //......(4)
...<releaseConneciton()>...; //......(5)
}catch(Exception e){}
}
¿Ö³Ä¸é, SQL¹®Àå¿¡ ¿ÀŸ°¡ ÀÖ¾ú°í, ÀÌ´Â prepareStatement("ddelete..")½ÃÁ¡¿¡ ¿¡·¯°¡
¹ß»ýÇÏ¿© pstmt °¡ ¿©ÀüÈ÷ null ÀÎ »óÅ·Πfinally Àý·Î ºÐ±âµÇ±â ¶§¹®ÀÎ °ÍÀÌÁÒ.
5.2.0 ¾Õ¼ 4.2¿¡¼µµ ¾ð±ÞÇßÁö¸¸, java.sql.StatementÀÇ executeQuery()¿¡ ÀÇÇÑ ResultSetÀº
Statement °¡ close µÉ¶§ ÀÚ¿øÀÌ °°ÀÌ ÇØÁ¦µÇ¹Ç·Î ´ÙÀ½°ú °°ÀÌ ÇÏ¿©µµ ±×¸® ¹®Á¦°¡ µÇÁø
¾Ê½À´Ï´Ù.
Connection conn = null;
Statement stmt = null;
//ResultSet rs = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select .....");
while(rs.next()){
......
}
rs.close(); // <---- !!!
}
catch(Exception e){
....
}
finally {
//if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
5.2.1 ±×·¯³ª PreparedStatement¿¡ ÀÇÇÑ ResultSet close()´Â ¾ê±â°¡ ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.
(2002.06.11 Ãß°¡ »çÇ×)
¸¹Àº ºÐµéÀÌ, "¾Æ´Ï ¼³·É ResultSet¸¦ closeÇÏÁö ¾Ê¾Ò´õ¶óµµ Statement/PreparedStatement¸¦
closeÇϸé ÇÔ²² ResultSet·Î closeµÇ´Â °Í ¾Æ´Ï³Ä, JDBC °¡À̵忡¼µµ ±×·¸´Ù°í
³ª¿Í ÀÖ´Ù, ¹«½¼ °³»Ô°°Àº ¼Ò¸®³Ä?" ¶ó±¸¿ä.
±×·¯³ª, ÇѰ¡Áö ´õ ÀÌÇØÇÏ¼Å¾ß ÇÒ ºÎºÐÀº, À¥½ºÇǾî, À¥·ÎÁ÷°ú °°Àº »ó¿ë À¥¾îÇø®ÄÉÀ̼Ç
¼¹öµéÀº ¼º´ÉÇâ»óÀ» À§ÇØ PreparedStatement ¹× ½ÉÁö¾î Statement¿¡ ´ëÇÑ Ä³½Ì±â´ÉÀ»
Á¦°øÇϰí ÀÖ½À´Ï´Ù. pstmt.close() ¸¦ ÇÏ¿´´Ù°í ÇÏ¿© Á¤¸» ÇØ´ç PreparedStatement°¡
closeµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó, ÇØ´ç PreparedeStatement°¡ »ý°Ü³ java.sql.Connection´ç ÁöÁ¤µÈ
°³¼ö±îÁö À¥¾îÇø®ÄÉÀ̼Ǽ¹ö ³»ºÎ¿¡¼ reference°¡ »ç¶óÁöÁö ¾Ê°í ij½Ã·Î ³²¾Æ ÀÖ°Ô µË´Ï´Ù.
°á±¹, ¿¬°üµÈ ResultSet ¿ª½Ã close()°¡ µÇÁö ¾ÊÀº ä ³²¾ÆÀÖ°Ô µÇ´Â °ÍÀÌÁö¿ä. ¸í½ÃÀûÀÎ
rs.close()¸¦ ŸÁö ¾ÊÀ¸¸é, À¥¾îÇø®ÄÉÀ̼Ǽ¹öÀÇ JVM³»ºÎ Èü¿µ¿ª »Ó¸¸¾Æ´Ï¶ó, Äõ¸®ÀÇ °á°ú·Î
µ¥ÀÌŸº£À̽º¿¡¼ Àӽ÷Π¸¸µé¾îÁø ¸Þ¸ð¸®µ¥ÀÌŸ°¡ »ç¶óÁöÁö ¾Ê´Â °á°ú¸¦ ³º°Ô µË´Ï´Ù.
ƯÈ÷ ResultSetÀÌ ´ÝÈ÷Áö ¾ÊÀ¸¸é DB¿¡¼ÀÇ CURSOR°¡ »ç¶óÁöÁö ¾Ê½À´Ï´Ù.
¶ÇÇÑ, CURSOR¸¦ ÀÚµ¿À¸·Î ´Ý°Å³ª ´ÝÁö ¾Ê´Â µîÀÇ ¿É¼ÇÀº WAS¸¶´Ù WASÀÇ DataSource¼³Á¤¿¡¼
CORSOR Çڵ鸵¿¡ ´ëÇÑ º°µµÀÇ ¿É¼ÇÀ» Á¦°øÇÏ°Ô µÇ¸ç ƯÈ÷ ¾Æ·¡ [Ç׸ñ6]¿¡¼ ´Ù½Ã ¾ð±ÞÇÒ
nested sql query 󸮽ÿ¡ ¹Î°¨ÇÑ ¹ÝÀÀÀ» ÇÏ°Ô µË´Ï´Ù.
µû¶ó¼, ¾Õ¼ÀÇ ÄÚµù ¹æ¹ýÀ» ¹Ýµå½Ã ´ÙÀ½Ã³·³ ResultSetµµ closeÇϽñ⸦ ´Ù½Ã±Ý Á¤Á¤ÇÏ¿©
±ÇÀå µå¸³´Ï´Ù.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // <---- !!!
try{
conn = ...<getConnection()>...;
pstmt = conn.prepareStatement("select .....");
rs = pstmt.executeQuery(); // <----- !!!
while(rs.next()){
......
}
//rs.close(); // <---- !!!
}
catch(Exception e){
....
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){} // <---- !!!
if ( pstmt != null ) try{pstmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
PS: À¥¾îÇø®ÄÉÀ̼Ǽ¹ö¿¡¼ÀÇ PreparedStatement ij½Ì±â´É¿¡ °üÇÑ ºÎºÐÀº ¾Æ·¡ÀÇ ±ÛµéÀ»
ÂüÁ¶Çϼ¼¿ä.
Connection Pool & PreparedStatement Cache Size
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=995572195
WebLogic¿¡¼ÀÇ PreparedStatement Cache -¼Á¤Èñ-
http://www.javaservice.net/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=1023286823
5.3 °£È¤, ´ÙÀ½°ú °°Àº ÄÚµùÀº ¹®Á¦¸¦ ¾ß±âÇÏÁö ¾ÊÀ» °ÍÀ̶ó°í »ý°¢ÇÏ´Â ºÐµéÀÌ ¸¹½À´Ï´Ù.
finally{
try{
if ( stmt != null ) stmt.close();
if ( conn != null ) conn.close();
}catch(Exception e){}
}
Àú¸íÇÑ ¸¹Àº Ã¥¿¡¼µµ À§Ã³·³ ÄÚµùµÇ¾î ÀÖ´Â °æ¿ì¸¦ Á¾Á¾º¾´Ï´Ù. ¸Â½À´Ï´Ù. Ưº°È÷ ¹®Á¦¼ºÀÌ
À־ÀÌÁö´Â ¾Ê½À´Ï´Ù. ±×·¯³ª, °£È¤ À¥¾îÇø®ÄÉÀ̼Ǽ¹öÀÇ Connection Pool°ú ¿¬°èÇÏ¿©
»ç¿ëÇÒ ¶© ¶§·Ð ¹®Á¦°¡ µÉ ¶§µµ ÀÖ½À´Ï´Ù. Áï, ¸¸¾à, stmt.close()½Ã¿¡ ExceptionÀÌ throw
µÇ¸é ¾î¶»°Ô µÇ°Ú½À´Ï±î?
¾Æ´Ï ¹«½¼ null üũ±îÁö Çߴµ¥, ¹«½¼ ExceptionÀÌ ¹ß»ýÇÏ´À³Ä°í ¹Ý¹®ÇÒ ¼öµµ ÀÖÁö¸¸,
¿À·£ ½Ã°£ÀÌ °É¸®´Â SQL JOB¿¡ ºüÁ® ÀÖ´Ù°¡ Connection PoolÀÇ "Orphan Timeout"ÀÌ Áö³ª
ÀÚµ¿À¸·Î ÇØ´ç ConnectionÀ» Pool¿¡ µ¹·Áº¸³»°Å³ª ȤÀº Ưº°ÇÑ marking󸮸¦ ÇØ µÑ ¼ö
ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì¶ó¸é stmt.close()½Ã¿¡ ÇØ´ç À¥¾îÇø®ÄÉÀ̼Ǽ¹ö¿¡ Æ¯ÈµÈ ExceptionÀÌ
¹ß»ýÇÏ°Ô µË´Ï´Ù. ±×·¸°Ô µÇ¸é conn.close()¸¦ ŸÁö ¸øÇÏ°Ô µÇ´Â »çŰ¡ ¹ú¾îÁý´Ï´Ù.
µû¶ó¼, ¾Õ¼ Ç϶ó°í ±ÇÀåÇÑ Çü½ÄÀ¸·Î ÄÚµùÇϼ¼¿ä.
6. Nested (Statemet) SQL Query Issue !!
6.1 ¾Æ·¡¿Í °°Àº ÄÚµùÀ» »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select deptno ...where id ='"+ id +"'");
while(rs.next()){
String deptno = rs.getString("deptno");
stmt.executeUpdate(
"update set dept_name = ... where deptno = '"+ deptno +"'"
);
......
}
rs.close();
}
catch(Exception e){
....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
À§ ÄÚµå´Â »ç½Ç ½ÇÇàÇÏÀÚ ¸»ÀÚ ´ÙÀ½°ú °°Àº ¿¡·¯¸¦ ¸¸³ª°Ô µË´Ï´Ù.
DB2 : -99999: [IBM][CLI Driver] CLI0115E Ä¿¼ »óŰ¡ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.
SQLSTATE=24000
Oracle :
¿¡·¯´Â µÎ¹øÂ° while(rs.next()) ½Ã¿¡ ¹ß»ýÇÕ´Ï´Ù. ¿Ö³Ä¸é, Statement°¡ nestedÇϰÔ
½ÇÇàµÈ executeUpdate() ¿¡ ÀÇÇØ ¾þ¾îÃÄ ¹ö·È±â ¶§¹®ÀÔ´Ï´Ù. ResultSet Àº
Statement¿Í ¹ÐÁ¢ÇÏ°Ô °ü·ÃÀÌ ÀÖ½À´Ï´Ù. ResultSetÀº ÀڷḦ ÀúÀåÇϰí ÀÖ´Â °´Ã¼°¡
¾Æ´Ï¶ó, µ¥ÀÌŸº£À̽º¿Í step by stepÀ¸·Î »óÈ£ Åë½ÅÇÏ´Â Interface ÀÏ »ÓÀ̱⠶§¹®ÀÔ´Ï´Ù.
µû¶ó¼ À§ ÄÚµå´Â ´ÙÀ½Ã³·³ ¹Ù²î¾îÁ®¾ß ÇÕ´Ï´Ù.
Connection conn = null;
Statement stmt1 = null;
Statement stmt2 = null;
try{
conn = ...<getConnection()>...;
stmt1 = conn.createStatement();
stmt2 = conn.createStatement();
ResultSet rs = stmt1.executeQuery("select deptno ...where id ='"+ id +"'");
while(rs.next()){
String deptno = rs.getString("deptno");
stmt2.executeUpdate(
"update set dept_name = ... where deptno = '"+ deptno +"'"
);
......
}
rs.close();
}
catch(Exception e){
....
}
finally {
if ( stmt1 != null ) try{stmt1.close();}catch(Exception e){}
if ( stmt2 != null ) try{stmt2.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
Áï, ResultSet¿¡ ´ëÇÑ fetch ÀÛ¾÷ÀÌ ¾ÆÁ÷ ³²¾Æ ÀÖ´Â »óÅ¿¡¼ °ü·ÃµÈ Statement¸¦
¶Ç´Ù½Ã executeQuery()/executeUpdate() ¸¦ ÇÏ¸é ¾ÈµÈ´Ù´Â °ÍÀÔ´Ï´Ù.
PS: IBM WebSphere ȯ°æÀÏ °æ¿ì, ¾Æ·¡ÀÇ ±ÛµéÀ» Ãß°¡·Î È®ÀÎÇϽñ⠹ٶø´Ï´Ù.
349 Re: Function sequence error (Version 3.x)
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=991154615
486 WAS4.0x: Function sequence error ÇØ°á
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=1015345459
7. executeUpdate() ÀÇ °á°ú¸¦ ºñÁî´Ï½º ·ÎÁ÷¿¡ ¸Â°Ô ÀûÀýÈ÷ Ȱ¿ëÇ϶ó.
7.1 ¾Æ·¡¿Í °°Àº ÄÚµùÀ» »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
public void someMethod(String empno) throws Exception {
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
stmt.executeUpdate(
"UPDATE emp SET name='ÀÌ¿ø¿µ' WHERE empno = '" + empno + "'"
);
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
}
»ç½Ç ÈçÈ÷µé ÀÌ·¸°Ô ÇϽʴϴÙ. º°·Î À߸øµÈ °Íµµ ¾ø¾îº¸ÀÔ´Ï´Ù. ±Ùµ¥, ¸¸¾à
DB TABLE¿¡ ÇØ´ç empno °ªÀÌ ¾øÀ¸¸é ¾î¶»°Ô µÉ±î¿ä? SQLException ÀÌ ¹ß»ý
Çϳª¿ä? ±×·¸Áö ¾ÊÁÒ? ¾Æ¹«·± ¿¡·¯¾øÀÌ ±×³É Èê·¯ ³»·Á ¿É´Ï´Ù. ±×·¯¸é, Update¸¦
ÇÏ·¯ µé¾î ¿Ô´Âµ¥, DB¿¡ UpdateÇÒ °ÍÀÌ ¾ø¾ú´Ù¸é ¾î¶»°Ô ÇØ¾ß Çմϱî? ±×³É ¹«½ÃÇϸé
µÇ³ª¿ä? ¾ÈµÇÁÒ.. µû¶ó¼, ´ÙÀ½ ó·³, ÀÌ·¯ÇÑ »óȲÀ» ÀÌ ¸Þ¼Òµå¸¦ ºÎ¸¥ °÷À¸·Î
¾Ë·Á Áà¾ß ÇÕ´Ï´Ù.
public void someMethod(String empno) throws Exception {
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
int affected = stmt.executeUpdate(
"UPDATE emp SET name='ÀÌ¿ø¿µ' WHERE empno = '" + empno + "'"
);
if ( affected == 0 ) throw new Exception("NoAffectedException");
else if ( affected > 1 ) throw new Exception("TooManyAffectedException");
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
}
¹°·Ð ÀÌ·¯ÇÑ ºÎºÐµéÀº ÇØ´ç ºñÁî´Ï½º·ÎÁ÷ÀÌ ¹¹³Ä¿¡ µû¶ó¼ ´Ù¸¨´Ï´Ù. ±×°ÍÀ» ¹«½ÃÄÉ
ÇÏ´Â °ÍÀÌ ºñÁî´Ï½º ·ÎÁ÷À̾ú´Ù¸é ±×³É ¹«½ÃÇÏ½Ã¸é µÇÁö¸¸, MIS ¼º ¾îÇø®ÄÉÀ̼ÇÀÇ
´ëºÎºÐÀº ÀÌó·³ update ³ª delete Äõ¸®ÀÇ °á°ú¿¡ µû¶ó ÀûÀýÇÑ Ã³¸®¸¦ ÇØ ÁÖ¾î¾ß
ÇÒ °ÍÀÔ´Ï´Ù.
8. Transaction 󸮸¦ ÇÒ ¶© ¼¼½ÉÇÏ°Ô ÇØ¾ß ÇÑ´Ù.
´Ü, ¾Æ·¡´Â À¥¾îÇø®ÄÉÀ̼Ǽ¹öÀÇ JTA(Java Transaction API)±â¹ÝÀÇ Æ®·»Á§¼Ç󸮰¡ ¾Æ´Ñ,
java.sql.Connection¿¡¼ÀÇ ¸í½ÃÀûÀÎ conn.setAutoCommit(false) ¸ðµå¸¦ ÅëÇÑ Æ®·»Á§¼Ç󸮿¡
´ëÇØ¼ ¾ð±Þ Çϰí ÀÖ½À´Ï´Ù.
8.1 Non-XA JDBC Transaction(¸í½ÃÀûÀÎ java.sql.Connection/commit/rollback)
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ...."); // -------- (1)
stmt.executeUpdate("DELETE ...."); // -------- (2)
stmt.executeUpdate("INSERT ...."); // -------- (3)
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ...<releaseConnection()>...;
}
À§¿Í °°Àº ÄÚµùÀº ¾Æ¹«¸® ºñÁî´Ï½ºÀû ¿ä±¸°¡ °£¼ÒÇÏ´õ¶óµµ, ½Ç ÇÁ·ÎÁ§Æ®¿¡¼´Â
ÀÖÀ» ¼ö°¡ ¾ø´Â ÄÚµùÀÔ´Ï´Ù.(JTS/JTA°¡ ¾Æ´Ñ ¸í½ÃÀûÀÎ Transaction 󸮽ÿ¡..)
´Ùµé ¾Æ½Ã°ÚÁö¸¸, (1), (2) ¹ø±îÁö´Â Á¤»óÀûÀ¸·Î Àß ¼öÇàµÇ¾ú´Âµ¥, (3)¹ø¹®ÀåÀ»
¼öÇàÇÏ¸é¼ SQLException ÀÌ ¹ß»ýÇÏ¸é ¾î¶»°Ô µÇ³ª¿ä? (1),(2)Àº ÀÌ¹Ì DB¿¡ ¹Ý¿µµÈ
ä·Î ³²¾Æ ÀÖ°Ô µË´Ï´Ù. ´ëºÎºÐÀÇ ºñÁî´Ï½º·ÎÁ÷Àº ±×·¸Áö ¾Ê¾ÒÀ» °Ì´Ï´Ù.
"(1),(2),(3)¹øÀÌ ¸ðµÎ Á¤»óÀûÀ¸·Î ¼öÇàµÇ°Å³ª, Çϳª¶óµµ À߸øµÇ¸é(?) ¸ðµÎ Ãë¼Ò
µÇ¾î¾ß ÇÑ´Ù"
°¡ ÀϹÝÀûÀÎ ºñÁî´Ï½ºÀû ¿ä±¸»çÇ×À̾úÀ» °Ì´Ï´Ù. µû¶ó¼, ´ÙÀ½Ã³·³ ÄÚµù µÇ¾î¾ß
ÇÕ´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ...."); // -------- (1)
stmt.executeUpdate("DELETE ...."); // -------- (2)
stmt.executeUpdate("INSERT ...."); // -------- (3)
conn.commit(); // <-- ¹Ýµå½Ã try{} ºí·°ÀÇ ¸¶Áö¸·¿¡ ¿Í¾ß ÇÕ´Ï´Ù.
}
catch(Exception e){
if ( conn != null ) try{conn.rollback();}catch(Exception ee){}
// error handling if you want
throw e; // <--- ÇÊ¿äÇÑ °æ¿ì, È£ÃâÇÑ °÷À¸·Î Exception»óȲÀ» ¾Ë·ÁÁÙ
// ¼öµµ ÀÖ½À´Ï´Ù
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
// in some connection pool, you have to reset commit mode to "true"
if ( conn != null ) ...<releaseConnection()>...;
}
8.2 auto commit mode ¸¦ "false"·Î ¼ÂÆÃÇÏ¿© ¸í½ÃÀûÀÎ Transaction °ü¸®¸¦ ÇÒ ¶§,
Á¤¸» Á¶½ÉÇØ¾ß ÇÒ ºÎºÐÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°Àº °æ¿ìÀÔ´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ...."); // ----------------------- (1)
ResultSet rs = stmt.executeQuery("SELECT ename ..."); // ---- (2)
if ( rs.next() ) {
conn.commit(); // ------------------- (3)
}
else {
conn.rollback(); // ----------------- (4)
}
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
// in some connection pool, you have to reset commit mode to "true"
if ( conn != null ) ...<releaseConnection()>...;
}
Äڵ尡 ¿Ö À§Ã³·³ µÆ´ÂÁö´Â Àúµµ ¸ð¸£°Ú½À´Ï´Ù. ´ÜÁö ºñÁî´Ï½º°¡ ±×·¯Çß³ªº¸ÁÒ..
¹®Á¦´Â ¸¸¾à, (2)¹ø executeQuery()¹®ÀåÀ» ¼öÇàÇÏ¸é¼ SQLException À̳ª ±âŸÀÇ
RuntimeException ÀÌ ¹ß»ýÇÒ ¶§ ÀÔ´Ï´Ù.
commit() À̳ª rollback()À» ŸÁö ¾Ê°í, finally Àý·Î °Ç³Ê ¶Ù¾î Statement¸¦
´Ý°í, connection Àº ¹ÝȯµË´Ï´Ù. À̶§, commit() À̳ª rollback()ÀÌ µÇÁö ¾ÊÀºÃ¤
(1)¹ø UPDATE ¹®ÀÌ ¼öÇàµÈä·Î ³²¾Æ ÀÖ°Ô µË´Ï´Ù. ÀÌ´Â DB LOCKÀ» Á¡À¯ÇϰÔ
µÇ°í, °æ¿ì¿¡ µû¶ó ´Ù¸£°ÚÁö¸¸, ´ÙÀ½¹ø ¿äû½Ã¿¡ DB LOCKÀ¸·Î ÀÎÇÑ hangÇö»óÀ»
ÃÊ·¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
ÀÏ´Ü Çѵΰ³ÀÇ ¾îÇø®ÄÉÀ̼ÇÀÌ ¾î¶°ÇÑ ÀÌÀ¯¿´µç, DB Lock À» ¹ß»ý½Ã۸é, ÇØ´ç
DB¿¡ °ü·ÃµÈ ¾îÇø®ÄÉÀ̼ǵéÀÌ ÀüºÎ ÀÀ´äÀÌ ¾ø°Ô µË´Ï´Ù. ÀÌ »óȲÀÌ Á¶±Ý¸¸
Áö¼ÓµÇ¸é, ÇØ´ç waiting À» À¯¹ßÇÏ´Â ¿äûµéÀÌ ¾îÇø®ÄÉÀ̼Ǽ¹öÀÇ ÃÖ´ë µ¿½Ã
Á¢¼Ó󸮼öÄ¡¿¡ µµ´ÞÇÏ°Ô µÇ°í, ÀÌ´Â Àüü ½Ã½ºÅÛÀÇ hangÇö»óÀ¸·Î À̾îÁö°Ô
µÇ´Â °ÍÀÌÁÒ..
µû¶ó¼, ºñÁî´Ï½º ·ÎÁ÷ÀÌ ¾î¶°Çßµç, ¹Ýµå½Ã ÁöÄÑÁ®¾ßÇÒ »çÇ×Àº ´ÙÀ½°ú °°½À´Ï´Ù.
"conn.setAutoComm(false); »óÅ¿¡¼ Çѹø ½ÇÇàµÈ Update¼º SQL Query´Â ÀÌÀ¯¸¦
¸··ÐÇÏ°í ¾î¶°ÇÑ °æ¿ì¿¡µµ commit() À̳ª rollback() µÇ¾î¾ß ÇÑ´Ù."
À§ÀÇ °æ¿ì¶ó¸é ´ÙÀ½Ã³·³ catch Àý¿¡¼ rollback ½ÃÄÑÁÖ´Â ºÎºÐÀÌ Ã·°¡µÇ¸é µÇ°Ú³×¿ä.
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ....");
ResultSet rs = stmt.executeQuery("SELECT ename ...");
if ( rs.next() ) {
conn.commit();
}
else {
conn.rollback();
}
}
catch(Exception e){ // <---- !!!!!
if ( conn != null ) try{conn.rollback();}catch(Exception ee){}
throw e;
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
// in some connection pool, you have to reset commit mode to "true"
if ( conn != null ) ...<releaseConnection()>...;
}
8.3 ¸ðµç °æ¿ìÀÇ ¼ö¸¦ »ý°¢Ç϶ó.
´ÙÀ½°ú °°Àº °æ¿ì¸¦ »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ....");
String idx = name.substring(3);
ResultSet rs = stmt.executeQuery("SELECT ename ... where idx=" + idx);
if ( rs.next() ) {
.....
}
rs.close(); rs = null;
stmt.executeUpdate("UPDATE ....");
conn.commit();
}
catch(SQLException e){
if ( conn != null ) try{conn.rollback();}catch(Exception ee){}
throw e;
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
// in some connection pool, you have to reset commit mode to "true"
if ( conn != null ) ...<releaseConnection()>...;
}
Àß Ã£¾Æ º¸¼¼¿ä. ¾îµð°¡ À߸øµÇ¾ú½À´Ï±î? Àß ¾Èº¸À̽ÃÁÒ?
Connection conn = null;
Statement stmt = null;
try{
conn = ...<getConnection()>...;
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE ...."); //---- (1)
String idx = name.substring(3); //<------ (2) NullPointerExceptoin ?
ResultSet rs = stmt.executeQuery("SELECT ename ... where idx=" + idx);
if ( rs.next() ) {
.....
}
rs.close(); rs = null;
stmt.executeUpdate("UPDATE ....");
conn.commit();
}
catch(SQLException e){ //<------ (3) ÀÌ ºÎºÐÀ» Å»±î?
if ( conn != null ) try{conn.rollback();}catch(Exception ee){}
throw e;
}
finally {
if ( rs != null ) try{rs.close();}catch(Exception e){}
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
// in some connection pool, you have to reset commit mode to "true"
if ( conn != null ) ...<releaseConnection()>...;
}
À§ Äڵ带 º¸µí, ¸¸¾à (1)À» ¼öÇà ÈÄ (2)¹ø ¿¡¼ NullPointerException À̳ª
ArrayIndexOutOfBoundExceptionÀÌ¶óµµ ³ª¸é ¾î¶»°Ô µÇÁÒ? catch(SQLException ...)¿¡´Â
°É¸®Áö ¾Ê°í °ð¹Ù·Î finally Àý·Î °Ç³Ê¶ç¾î ¹ö¸®³×¿ä. ±×·³ (1)¿¡¼ update µÈ °ÍÀº
commit()À̳ª rollback() ¾øÀÌ connection ÀÌ ¹ÝȯµÇ³×¿ä... ;-)
¾î¶»°Ô ÇØ¾ß Çմϱî? SQLException¸¸ Àâ¾Æ¼ µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó, catch(Exception ...)°ú
°°ÀÌ ¸ðµç Exception À» catchÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.
8.4 À§ ÁÖ¼®¹®¿¡¼µµ ¾ð±ÞÇØ µÎ¾úÁö¸¸, Hans Bergsteins ÀÇ DBConnectionManager.java
¿Í °°Àº Connection Pool À» »ç¿ëÇÒ °æ¿ì¿¡, °³¹ßÀÚÀÇ Äڵ忡¼ transaction auto
commit mode ¸¦ ¸í½ÃÀûÀ¸·Î "false"·Î ÇÑ ÈÄ, À̸¦ ±×³É pool ¿¡ ¹ÝȯÇϽøé,
±× ´ÙÀ½ »ç¿ëÀÚ°¡ pool ¿¡¼ ±× connection À» »ç¿ëÇÒ °æ¿ì, ¿©ÀüÈ÷ transaction
mode °¡ "false"°¡ µÈ´Ù´Â °ÍÀº ÁÖÁöÇÏ¼Å¾ß ÇÕ´Ï´Ù. µû¶ó¼, DBConnectionMangerÀÇ
release method¸¦ ¼öÁ¤ÇϽõçÁö, ȤÀº °³¹ßÀÚ°¡ ¸í½ÃÀûÀ¸·Î ÃʱâÈÇÑ ÈÄ pool ¿¡
¹ÝȯÇÏ¼Å¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì, DB Lock ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.
¹Ý¸é, IBM WebSphere ³ª BEA WebLogic °ú °°ÀÎ JDBC 2.0 ½ºÆå¿¡ ÁØÇÏ´Â Connection
PoolÀ» »ç¿ëÇÒ °æ¿ì´Â ¹ÝȯÇÒ ´ç½ÃÀÇ transaction mode °¡ ¹«¾ùÀ̾úµç °£¿¡,
pool ¿¡¼ ²¨³»¿À´Â connection ÀÇ transaction mode´Â Ç×»ó ÀÏÁ¤ÇÕ´Ï´Ù.
(default °ªÀº ¿£ÁøÀÇ ¼³Á¤¿¡ µû¶ó ´Þ¶óÁý´Ï´Ù.)
±×·¸´Ù°í commit ½ÃŰÁö ¾ÊÀº ½ÇÇàµÈ Äõ¸®°¡ ÀÚµ¿À¸·Î commit/rollback µÇ´Â °ÍÀº
¾Æ´Õ´Ï´Ù. ´ÜÁö auto commit ¸ðµå¸¸ ÀÚµ¿À¸·Î ÃʱâÈ µÉ »ÓÀÔ´Ï´Ù.
PS:WASÀÇ JTS/JTA Æ®·»Á§¼Ç ±â¹ÝÀ¸·Î ¿î¿µµÉ °æ¿ì´Â ¸í½ÃÀûÀ¸·Î commit/rollbackµÇÁö
¾ÊÀº Æ®·»Á§¼ÇÀº ÀÚµ¿À¸·Î rollbackµÇ°Å³ª commitµË´Ï´Ù. default´Â WAS ¼³Á¤¿¡ µû¶ó
´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.
---------------
NOTE: ÀÚ¹Ù¼ºñ½ºÄÁ¼³ÆÃÀÇ WAS¼º´É°ü¸®/¸ð´ÏÅ͸µ ÅøÀÎ Á¦´ÏÆÛ(Jennifer 2.0)¸¦ Àû¿ëÇϸé,
¾îÇø®ÄÉÀ̼ǿ¡¼ ¸í½ÃÀûÀ¸·Î commit/rollback½ÃŰÁö ¾Ê°í ±×´ë·Î ¹Ýȯ½ÃŲ ¾îÇø®ÄÉÀ̼ÇÀÇ
¼Ò½º À§Ä¡¸¦ ½Ç½Ã°£À¸·Î °¨ÁöÇÏ¿© ¾Ë·ÁÁÝ´Ï´Ù. À̸¦ ¸¸¾à ¼öÀÛ¾÷À¸·Î ÇÑ´Ù¸é, ¼ö¸¹Àº ÄÚµå
Áß ¾îµð¿¡¼ DB lockÀ» À¯¹ß ½ÃŰ´Â Äڵ尡 ¼û¾îÀÖ´ÂÁö¸¦ ã±â°¡ °æ¿ì¿¡ µû¶ó ¸¸¸¸Ä¡ ¾ÊÀº
°æ¿ì°¡ ¸¹½À´Ï´Ù.
8.5 XA JDBC Driver, J2EE JTS/JTA
JDBC 2.0, Ç¥ÁØ javax.sql.DataSource¸¦ ÅëÇÑ JDBC ConnectionÀ» »ç¿ëÇÒ °æ¿ì¿¡,
´ëºÎºÐÀÇ »ó¿ëWASÁ¦Ç°µéÀº J2EEÀÇ Ç¥ÁØ JTS(Java Transaction Service)/JTA(Java Transaction
API)¸¦ ±¸ÇöÇϰí ÀÖ½À´Ï´Ù. Ưº°È÷, Çϳª ÀÌ»óÀÇ µ¥ÀÌŸº£À̽º¿¡¼ 2 phase-commit°ú
°°Àº XA Protocol¸¦ Áö¿øÇϰí ÀÖÁö¿ä(»ç½Ç WAS¿¡¼ 2PC°¡ Áö¿øµÇ±â ½ÃÀÛÇÑ °ÍÀº ¸î³â
µÇÁö ¾Ê½À´Ï´Ù. 2PC¸¦ »ç¿ëÇÏ·Á¸é ¹Ýµå½Ã XA-JDBC Driver°¡ WAS¿¡ ¼³Ä¡µÇ¾î¾ß ÇÕ´Ï´Ù)
»ùÇà ¿¹Á¦´Â ´ÙÀ½°ú °°½À´Ï´Ù.
...
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn1 = null;
java.sql.Statement stmt1 = null;
java.sql.Connection conn2 = null;
java.sql.Statement stmt2 = null;
java.sql.CallableStatement cstmt2 = null;
try {
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
tx = (javax.transaction.UserTransaction) ctx.lookup("java:comp/UserTransaction");
// Æ®·»Á§¼Ç ½ÃÀÛ
tx.begin();
// -------------------------------------------------------------------------
// A. UDB DB2 7.2 2PC(XA) Test
// -------------------------------------------------------------------------
javax.sql.DataSource ds1 =
(javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/DB2");
conn1 = ds1.getConnection();
stmt1 = conn1.createStatement();
stmt1.executeUpdate(
"insert into emp(empno,ename) values(" + empno + ",'Name" + empno + "')"
);
stmt1.executeUpdate(
"update emp set ename = 'LWY" + count + "' where empno = 7934"
);
java.sql.ResultSet rs1 = stmt1.executeQuery("select empno,ename from emp");
while(rs1.next()){
...
}
rs1.close();
// -------------------------------------------------------------------------
// B. Oracle 8.1.7 2PC(XA) Test
// -------------------------------------------------------------------------
javax.sql.DataSource ds2 =
(javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/ORA8i");
conn2 = ds2.getConnection();
stmt2 = conn2.createStatement();
stmt2.executeUpdate(
"update emp set ename = 'LWY" + count + "' where empno = 7934"
);
java.sql.ResultSet rs2 = stmt2.executeQuery("select empno,ename from emp");
while(rs2.next()){
...
}
rs2.close();
// -------------------------------------------------------------------------
// Æ®·»Á§¼Ç commit
tx.commit();
}
catch(Exception e){
// Æ®·»Á§¼Ç rollback
if ( tx != null ) try{tx.rollback();}catch(Exception ee){}
...
}
finally {
if ( stmt1 != null ) try { stmt1.close();}catch(Exception e){}
if ( conn1 != null ) try { conn1.close();}catch(Exception e){}
if ( stmt2 != null ) try { stmt2.close();}catch(Exception e){}
if ( conn2 != null ) try { conn2.close();}catch(Exception e){}
}
NOTE: À§¿¡¼ ¼³¸íÇÑ ÇϳªÇϳª°¡ Á¦ ÀÔÀå¿¡¼ º¸¸é ³Ê¹«³ª °¡½¿±íÀÌ ´Ù°¡¿À´Â
¹®Á¦µéÀÔ´Ï´Ù. °³¹ßÇϽô ºÐÀÇ ÀÔÀå¿¡¼ º¸¸é, À§ÀÇ °¡À̵忡 Á¶±Ý ¾î±ß³µ´Ù°í
¹¹±×¸® ¹®Á¦°Ú´À³Ä°í ¹Ý¹®ÇÏ½Ç ¼ö ÀÖÁö¸¸, ¼ö¹éº»ÀÇ ¼Ò½ºÄÚµå Áß¿¡ À§¿Í °°Àº ±ÔÄ¢À»
ÁؼöÇÏÁö ¾ÊÀº Äڵ尡 ´Ü Çϳª¶óµµ ÀÖ´Ù¸é, Àß ¿î¿µµÇ´ø ½Ã½ºÅÛÀÌ ¸çÄ¥¿¡ Çѹø¾¿
¿¡·¯¸¦ ¾ß±âÇϰųª ÀÀ´äÀÌ ´À·ÁÁö°í ±Þ±â¾ß hang Çö»óÀ» ÃÊ·¡ÇÏ´Â °á°ú¸¦ °¡Á® ¿É´Ï´Ù.
Á¤¸»(!) ±×·¸½À´Ï´Ù.
NOTE: À§¿¡¼ »ç¿ëÇÑ ÄÚµù »ùÇõéÀº JDBC Connection Pooling Àº ÀüÇô °í·ÁÄ¡ ¾Ê°í
¼³¸íµå·È½À´Ï´Ù. ±×·¯Ç߱⠶§¹®¿¡ <getConnection()>, <releaseConnection()> À̶õ
Pseudo ÄÚµå·Î ¼³¸íÇß´ø °ÍÀÔ´Ï´Ù.
¹Ýµå½Ã "¼ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× -Á¦2ź-" À» ÀÐ¾î º¸¼¼¿ä.
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968522077
-------------------------------------------------------
º» ¹®¼´Â ÀÚÀ¯·Ó°Ô ¹èÆ÷/º¹»ç ÇÒ ¼ö ÀÖÀ¸³ª ¹Ýµå½Ã
ÀÌ ¹®¼ÀÇ ÀúÀÚ¿¡ ´ëÇÑ ¾ð±ÞÀ» »èÁ¦ÇÏ½Ã¸é ¾ÈµË´Ï´Ù
================================================
ÀÚ¹Ù¼ºñ½º³Ý ÀÌ¿ø¿µ
E-mail: javaservice@hanmail.net
PCS:010-6239-6498
================================================
|