Connetion POOL·Î ÇØ°áÇÕ´Ï´Ù.


[ ´ÙÀ½ ±Ûµé ] [ À̾ ±Û¿Ã¸®±â(´äÇϱâ) ] [ ÀÚ¹Ù ¹¯°í ´äÇϱâ ]

±Û¾´ÀÌ :À±Áö¼ö 1998³â 9¿ù 08ÀÏ 22:19:21

In Reply to: [Áú¹®] java.sql.Connection°ú mutithread posted by °­½Åµ¿ on 1998³â 9¿ù 08ÀÏ 11:15:56:

Àúµµ ±×¹®Á¦ ¶§¹®¿¡ °í¹ÎÀ» ¸¹ÀÌ ÇÏ¿´´Âµ¥.
¾î¶° ¿Ü±¹ »çÀÌÆ®¿¡¼­ Connection POOLÀ» ÀÌ¿ëÇÏ´õ±º¿ä..
±×·¯´Ï±î Ãʱ⠿¬°á½Ã¿¡ ConnectionÀ» ¿©·¯°³ ÇÏ¿© stack³ª ¹è¿­¿¡ ÀúÀåÇÏ¿© ³õ°í ¸Å¿¬°áÀÌ ÀÌ·ç¾î Áú¶§¸¶´Ù connectionÀ» ¿­Áö ¾Ê°í stack¿¡¼­³ª ¹è¿­¿¡¼­ °¡Á®¿À´õ±º¿ä...
±×¸®°í ¸Ç¸¶Áö¸·¿¡ connectionÀ» Á¾·áÇϱ¸¿ä..


´ÙÀ½Àº ÀÌ·± °æ¿ìÀÇ Á¦°¡ ÀÛ¾÷ÇÏ´ø ¼Ò½ºÀÔ´Ï´Ù.



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.util.Date;



public class customregister extends HttpServlet
//implements SingleThreadModel
{
DbConnectionPool myPool=null;
//////////////////////////////////////////////////////////////////////////////

public void init(ServletConfig config) throws ServletException
{
super.init(config);
String driver="weblogic.jdbc.mssqlserver4.Driver";
String URL = "jdbc:weblogic:mssqlserver4:mall@SMNETNT";
String username = "sa";
String password = "smnet0531";

try {
myPool = new DbConnectionPool(driver,URL,username,password,2,7,".",2.0);
} catch (Exception e) {
getServletContext().log(e.getMessage());
return;
}

}

//////////////////////////////////////////////////////////////////////////////





public void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{


String memberid=req.getParameter("memberid");
String passwd=req.getParameter("passwd");
String kname=toHangul(req.getParameter("kname"));
String jumin1=req.getParameter("jumin1");
String jumin2=req.getParameter("jumin2");
String email=req.getParameter("email");
String job=req.getParameter("job");
String citycode3=req.getParameter("citycode3");
String home_kuk=req.getParameter("home_kuk");
String home_no=req.getParameter("home_no");
String zipcode1=req.getParameter("zipcode1");
String zipcode2=req.getParameter("zipcode2");
String address=req.getParameter("address");
String old=req.getParameter("old");
String payment=req.getParameter("payment");
String use_bank=req.getParameter("use_bank");
String cardtype=req.getParameter("cardtype");
String cardno=req.getParameter("cardno");
String cardowner=req.getParameter("cardowner");
String duedate=req.getParameter("duedate");

String cookiestring=kname+"#"+old;
Cookie c=new Cookie("shopcustom",cookiestring);
c.setComment("this is shop Hot item");
c.setMaxAge(10000 *24*60*60);
c.setPath("/");
res.addCookie(c);
// ÄíÅ° ÀúÀåÀ¸·Î »ç¿ëÀÚÀÇ À̸§°ú ¿¬·ÉÀ» ÀúÀåÇÑ´Ù.


if(payment.equals("1"))
{
cardtype="";
cardno="";
cardowner="";
duedate="";
}
else
{
use_bank="";
}



Connection con=null;
PreparedStatement customstmt=null;


try {
con=myPool.getConnection();
customstmt = con.prepareStatement("insert into customtable values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
customstmt.setString(1,memberid);
customstmt.setString(2,passwd);
customstmt.setString(3,kname);
customstmt.setInt(4,Integer.parseInt(jumin1));
customstmt.setInt(5,Integer.parseInt(jumin2));
customstmt.setString(6,"email");
customstmt.setInt(7,Integer.parseInt(job));
customstmt.setInt(8,Integer.parseInt(citycode3));
customstmt.setInt(9,Integer.parseInt(home_kuk));
customstmt.setInt(10,Integer.parseInt(home_no));
customstmt.setInt(11,Integer.parseInt(zipcode1));
customstmt.setInt(12,Integer.parseInt(zipcode2));
customstmt.setString(13,address);
customstmt.setInt(14,Integer.parseInt(old));
customstmt.setInt(15,Integer.parseInt(payment));
customstmt.setInt(16,Integer.parseInt(use_bank));
customstmt.setInt(17,Integer.parseInt(cardtype));
customstmt.setInt(18,Integer.parseInt(cardno));
customstmt.setString(19,"cardowner");
customstmt.setString(20,"duedate");
customstmt.executeUpdate();
} catch (Exception e) {
getServletContext().log(e.getMessage());
new PrintWriter(res.getOutputStream()).println("<p>"+e.toString()+"</p>");
return;
}
finally {
try{if(customstmt != null) {customstmt.close();}} catch(SQLException e1){};
myPool.freeConnection(con);
}


RegisterDisplay(req,res);
destroy();
}


public void RegisterDisplay(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
res.setContentType("text/html;charset=euc-kr");
res.setHeader("pragma","no-cash");
PrintWriter pout=new PrintWriter(res.getOutputStream());
pout.println("<html><body>µî·ÏÀÌ ¿Ï·á µÇ¾ú½À´Ï´Ù</body></html>");
pout.close();
}



public void destroy()
{
try{
myPool.destroy();
super.destroy();
}catch(Exception e) {getServletContext().log(e.toString()); }


}



//////////////////////////////////////////////////////////////////////////////


public static String toHangul( String str )
throws UnsupportedEncodingException
{
if ( str == null )
return null;
return new String( str.getBytes("8859_1"), "KSC5601" );
}
//////////////////////////////////////////////////////////////////////////////



} // customregister of end



class DbConnectionPool implements Runnable
{


public DbConnectionPool(String dbDriver, String dbServer, String dbLogin, String dbPassword, int minConns, int maxConns, String logFileString,
double maxConnTime)
throws IOException
{
connPool = new Connection[maxConns];
connStatus = new int[maxConns];
connLockTime = new long[maxConns];
connCreateDate = new long[maxConns];
connID = new String[maxConns];
currConnections = minConns;


this.maxConns = maxConns;
this.dbDriver = dbDriver;
this.dbServer = dbServer;
this.dbLogin = dbLogin;
this.dbPassword = dbPassword;
maxConnMSec = (int)(maxConnTime * 86400000D);
if(maxConnMSec < 30000)
maxConnMSec = 30000;
try
{
log = new PrintStream(new FileOutputStream(logFileString));
}
catch(IOException ex)
{
now = new Date();
log = new PrintStream(new FileOutputStream("DCB_" + String.valueOf(now.getTime()) + ".log"));
}
log.println("Starting DbConnectionPool Version 1.0.6:");
log.println("dbDriver = " + dbDriver);
log.println("dbServer = " + dbServer);
log.println("dbLogin = " + dbLogin);
log.println("log file = " + logFileString);
log.println("minconnections = " + minConns);
log.println("maxconnections = " + maxConns);
log.println("Total refresh interval = " + maxConnTime + " days");
log.println("-----------------------------------------");
boolean connectionsSucceeded = false;
int dbLoop = 20;
try
{
for(int i = 1; i < dbLoop;)
try
{
for(int j = 0; j < currConnections; j++)
createConn(log, j);


connectionsSucceeded = true;
break;
}
catch(SQLException e)
{
log.println("--->Attempt (" + String.valueOf(i) + " of " + String.valueOf(dbLoop) + ") failed to create new connections set at startup: ");
log.println(" " + e);
log.println(" Will try again in 15 seconds...");
try
{
Thread.sleep(15000L);
}
catch(InterruptedException ex) {}
i++;
}


if(!connectionsSucceeded)
{
log.println("\r\nAll attempts at connecting to Database exhausted");
throw new IOException();
}
}
catch(Exception ex)
{
throw new IOException();
}
if(runner == null)
{
runner = new Thread(this);
runner.start();
}
}


public void run()
{
boolean forever = true;
Statement stmt = null;
String currCatalog = null;
while(forever)
{
for(int i = 0; i < currConnections; i++)
try
{
currSQLWarning = connPool[i].getWarnings();
if(currSQLWarning != null)
{
log.println("Warnings on connection " + String.valueOf(i) + " " + currSQLWarning);
connPool[i].clearWarnings();
}
}
catch(SQLException e)
{
log.println("Cannot access Warnings: " + e);
}


for(int i = 0; i < currConnections; i++)
{
Date now = new Date();
long lnow = now.getTime();
long age = lnow - connCreateDate[i];
synchronized(connStatus)
{
if(connStatus[i] > 0)
{
continue;
}
connStatus[i] = 2;
}
try
{
if(age > maxConnMSec)
throw new SQLException();
stmt = connPool[i].createStatement();
connStatus[i] = 0;
}
catch(SQLException ex)
{
try
{
log.println(now.toLocaleString() + " ***** Recycling connection " + String.valueOf(i) + ":");
createConn(log, i);
}
catch(SQLException e1)
{
log.println("Failed: " + e1);
connStatus[i] = 0;
}
}
finally
{
try
{
if(stmt != null)
stmt.close();
}
catch(SQLException ex) {}
}
}


try
{
Thread.sleep(10000L);
}
catch(InterruptedException ex) {}
}


}


public Connection getConnection()
{
Connection conn = null;
boolean gotOne = false;
for(int outerloop = 1; outerloop <= 10; outerloop++)
{
try
{
int loop = 0;
int roundRobin = connLast + 1;
if(roundRobin >= currConnections)
roundRobin = 0;
do
synchronized(connStatus)
{
if(connStatus[roundRobin] < 1)
{
if(!connPool[roundRobin].isClosed())
{
conn = connPool[roundRobin];
connStatus[roundRobin] = 1;
Date now = new Date();
connLockTime[roundRobin] = now.getTime();
connLast = roundRobin;
gotOne = true;
break;
}
}
else
{
loop++;
if(++roundRobin >= currConnections)
roundRobin = 0;
}
}
while(!gotOne && loop < currConnections);
}
catch(SQLException ex) {}
if(gotOne)
break;
synchronized(this)
{
if(currConnections < maxConns)
{
try
{
createConn(log, currConnections);
}
catch(SQLException e)
{
log.println("Unable to create new connection: " + e);
}
currConnections++;
}
}
try
{
Thread.sleep(2000L);
}
catch(InterruptedException ex) {}
log.println("-----> Connections Exhausted! Will wait and try again in loop " + String.valueOf(outerloop));
}


return conn;
}


public int idOfConnection(Connection conn)
{
String tag;
try
{
tag = conn.toString();
}
catch(NullPointerException ex)
{
tag = "none";
}
int match = -1;
for(int i = 0; i < currConnections; i++)
{
if(!connID[i].equals(tag))
continue;
match = i;
break;
}


return match;
}


public String freeConnection(Connection conn)
{
String res = "";
int thisconn = idOfConnection(conn);
if(thisconn >= 0)
{
connStatus[thisconn] = 0;
res = "freed " + conn.toString();
}
else
{
log.println("----> Could not free connection!!!");
}
return res;
}


public long getAge(Connection conn)
{
Date now = new Date();
long lnow = now.getTime();
int thisconn = idOfConnection(conn);
long diff = lnow - connLockTime[thisconn];
return diff;
}


private void createConn(PrintStream out, int i)
throws SQLException
{
Date now = new Date();
try
{
Class.forName(dbDriver);
connPool[i] = DriverManager.getConnection(dbServer, dbLogin, dbPassword);
connStatus[i] = 0;
connID[i] = connPool[i].toString();
connLockTime[i] = 0L;
now = new Date();
connCreateDate[i] = now.getTime();
}
catch(ClassNotFoundException ex) {}
log.println(now.toLocaleString() + " Opening connection " + String.valueOf(i) + " " + connPool[i].toString() + ":");
}


public void destroy()
{
if(runner != null)
runner.stop();
for(int i = 0; i < currConnections; i++)
try
{
connPool[i].close();
}
catch(SQLException ex)
{
log.println("Cannot close connections on Destroy");
}


}


private Thread runner;
Connection connPool[];
int connStatus[];
Date now;
long connLockTime[];
long connCreateDate[];
String connID[];
String dbDriver;
String dbServer;
String dbLogin;
String dbPassword;
String logFileString;
int currConnections;
int connLast;
int minConns;
int maxConns;
int maxConnMSec;
PrintStream log;
SQLWarning currSQLWarning;
}



´ÙÀ½ ±Ûµé:



À̾ ±Û¿Ã¸®±â(´äÇϱâ)

À̸§:
E-Mail:
Á¦¸ñ:
³»¿ë:
HTML ÅÂ±× Æ÷ÇÔ ¿©ºÎ: HTML ¹®¼­ÀÏ °æ¿ì üũ
°ü·Ã URL(¼±ÅÃ):
URL Á¦¸ñ(¼±ÅÃ):
°ü·Ã À̹ÌÁö URL:


[ ´ÙÀ½ ±Ûµé ] [ À̾ ±Û¿Ã¸®±â(´äÇϱâ) ] [ ÀÚ¹Ù ¹¯°í ´äÇϱâ ]