 |
À¥ÇÁ·Î±×·¡¹Ö(±âŸ) |
PHP, ASP, Perl, CGI µî °¢Á¾ À¥ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ÀÚ·áµéÀÔ´Ï´Ù. |
|
 |
|

 |


¼ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× -Á¦2ź-
[JDBC Connection Pooling]
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.01.19
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.03.20(»ùÇÿ¹Á¦Ãß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.10.22(µð¹ö±ëÀ» À§ÇÑ ·ÎÁ÷Ãß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.10.29(Oracle JDBC2.0 »ùÇÃÃß°¡)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.11.08(À±ÇѼº´Ô µµ¿ò OracleConnectionCacheImpl ¼Ò½º¼öÁ¤)
ÃÖ±Ù¼öÁ¤ÀÏÀÚ : 2001.11.09(Trace/DebuggingÀ» À§ÇÑ Àå¹®ÀÇ »çÁ·À» ´ã)
5. JDBC Connection Pooling À» ¿Ö »ç¿ëÇØ¾ß Çϴ°¡ ?
Pooling À̶õ ¿ë¾î´Â ÀϹÝÀûÀÎ ¿ë¾îÀÔ´Ï´Ù. Socket Connection Pooling, Thread
Pooling, Resource Pooling µî "¾î¶² ÀÚ¿øÀ» ¹Ì¸® Pool ¿¡ ÁغñÇØµÎ°í ¿äû½Ã Pool¿¡
ÀÖ´Â ÀÚ¿øÀ» °ð¹Ù·Î ²¨³»¾î Á¦°øÇÏ´Â ±â´É"ÀÎ °ÅÁÒ.
JDBC Connection Pooling Àº JDBC¸¦ ÀÌ¿ëÇÏ¿© ÀÚ¹Ù¿¡¼ DB¿¬°áÀ» ÇÒ ¶§, ¹Ì¸® Pool¿¡
¹°¸®ÀûÀÎ DB ¿¬°áÀ» ÀÏÁ¤°³¼ö À¯ÁöÇÏ¿© µÎ¾ú´Ù°¡ ¾îÇø®ÄÉÀ̼ǿ¡¼ ¿ä±¸ÇÒ ¶§ °ð¹Ù·Î
Á¦°øÇØÁÖ´Â ±â´ÉÀ» ÀÏÄ´ ¿ë¾îÀÔ´Ï´Ù. JDBC ¿¬°á½Ã¿¡, (DB Á¾·ù¸¶´Ù, ±×¸®°í JDBC
DriverÀÇ Å¸ÀÔ¿¡ µû¶ó ¾à°£¾¿ ´Ù¸£±ä ÇÏÁö¸¸ ) ´ë·« 200-400 ms °¡ ¼Ò¿ä µË´Ï´Ù. ±â²¯
0.2 ÃÊ 0.4 ÃÊ ¹Û¿¡ ¾ÈµÇ´Â µ¥ ¹«½¼ ¹®Á¦³Ä ¶ó°í ¹Ý¹®ÇÒ¼öµµ ÀÖ½À´Ï´Ù.
ÇÏÁö¸¸, À§ ½Ã°£Àº ÇϳªÀÇ ¿¬°áÀ» ½ÃµµÇÒ ¶§ ±×·¯ÇÏ°í, 100 - 200°³¸¦ µ¿½Ã¿¡ ¿¬°áÀ»
½ÃµµÇÏ¸é ¾ê±â°¡ ¿ÏÀüÈ÷ ´Þ¶óÁý´Ï´Ù.
¾Æ·¡´Â Á÷Á¢ JDBC µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ¿© ¿¬°áÇÒ ¶§¿Í JDBC Connection Pooling À» »ç¿ë
ÇÒ ¶§ÀÇ ¼º´É ºñ±³ °á°úÀÔ´Ï´Ù.
------------------------------------------------------------------
Å×½ºÆ® ȯ°æ
LG-IBM 570E Notebook(CPU:???MHz , MEM:320MB)
Windows NT 4.0 Service Pack 6
IBM WebSphere 3.0.2.1 + e-Fixes
IBM HTTP Server 1.3.6.2
IBM UDB DB2 6.1
¾Æ·¡¿¡ ÷ºÎÇÑ ÆÄÀÏ´Â ÀڷḦ ¸¸µé¶§ »ç¿ëÇÑ JSP¼Ò½ºÀÔ´Ï´Ù. (÷ºÎÆÄÀÏÂüÁ¶)
[HttpConn.java] °£´ÜÇÑ Stress Test ÇÁ·Î±×·¥
¾Æ·¡ÀÇ ¼öÄ¡´Â ÀÌ ¹®¼ ÀÌ¿Ü¿¡´Â ´Ù¸¥ ¿ëµµ·Î »ç¿ëÇÏ½Ã¸é ¾ÈµË´Ï´Ù. Å×½ºÆ®¸¦ ÀúÀÇ
°³ÀÎ ³ëÆ®ºÏ¿¡¼ ÃøÁ¤ÇÑ °ÍÀÌ°í, ¶ÇÇÑ Å×½ºÆ® ÇÁ·Î±×·¥ ¿ª½Ã Á÷Á¢ ¸¸µé¾îÇÑ °ÍÀÎ
¸¸Å, °øÁ¤¼ºÀ̳ª ¼öÄ¡¿¡ ´ëÇÑ ½Å·Ú¸¦ ºÎ¿©ÇÒ ¼ö´Â ¾ø½À´Ï´Ù.
±×·¯³ª JDBC Connection Pooling Àû¿ë ¿©ºÎ¿¡ µû¸¥ »ó´ëÀûÀÎ Â÷À̸¦ ¼³¸íÇϱ⿡´Â
ÃæºÐÇÒ °Í °°½À´Ï´Ù.
Å×½ºÆ® °á°ú
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
¸Å¹ø Á÷Á¢ JDBC Driver ¿¬°áÇÏ´Â °æ¿ì
java HttpConn http://localhost/db_jdbc.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0
TOTAL( 1,10) iteration=10 , average=249.40 (ms), TPS=3.93
TOTAL(50,10) iteration=500 , average=9,149.84 (ms), TPS=4.83
TOTAL(100,10) iteration=1000 , average=17,550.76 (ms), TPS=5.27
TOTAL(200,10) iteration=2000 , average=38,479.03 (ms), TPS=4.89
TOTAL(300,10) iteration=3000 , average=56,601.89 (ms), TPS=5.01
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DB Connection Pooing À» »ç¿ëÇÏ´Â °æ¿ì
java HttpConn http://localhost/db_pool_cache.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0
TOTAL(1,10) iteration=10 , average=39.00 (ms), TPS=23.26
TOTAL(1,10) iteration=10 , average=37.10 (ms), TPS=24.33
TOTAL(50,10) iteration=500 , average=767.36 (ms), TPS=45.27
TOTAL(50,10) iteration=500 , average=568.76 (ms), TPS=61.26
TOTAL(50,10) iteration=500 , average=586.51 (ms), TPS=59.79
TOTAL(50,10) iteration=500 , average=463.78 (ms), TPS=67.02
TOTAL(100,10) iteration=1000 , average=1,250.07 (ms), TPS=57.32
TOTAL(100,10) iteration=1000 , average=1,022.75 (ms), TPS=61.22
TOTAL(200,10) iteration=1462 , average=1,875.68 (ms), TPS=61.99
TOTAL(300,10) iteration=1824 , average=2,345.42 (ms), TPS=61.51
NOTE: average:Æò±Õ¼öÇà½Ã°£, TPS:ÃÊ´ç 󸮰Ǽö
------------------------------------------------------------------
Áï, JDBC Driver ¸¦ ÀÌ¿ëÇÏ¿© Á÷Á¢ DB¿¬°áÀ» ÇÏ´Â ±¸Á¶´Â ±â²¯ 1ÃÊ¿¡ 5°³ÀÇ ¿äûÀ»
ó¸®ÇÒ ¼ö ÀÖ´Â ´É·ÂÀÌ ÀÖ´Â ¹Ý¸é, DB Connection Pooling À» »ç¿ëÇÒ °æ¿ì´Â ÃÊ´ç
60¿©°³ÀÇ ¿äûÀ» ó¸®ÇÒ ¼ö ÀÖ´Â °ÍÀ¸·Î ³ªÅ¸³µ½À´Ï´Ù.
12¹èÀÇ ¼º´ÉÇâ»óÀ» °¡Á®¿Â°ÅÁÒ. (ÀÌ ¼öÄ¡´Â H/W±âÁ¾°ú ÃøÁ¤¹æ¹ý, ±×¸®°í ¾îÇø®ÄÉÀ̼ǿ¡
µû¶ó ´Ù¸£°Ô ³ª¿À´Ï ÀÌ ¼öÄ¡ÀÚü¿¡ ³Ê¹« Å« Àǹ̸¦ µÎÁø ¸¶¼¼¿ä)
ÁÖÀÇ: ÈçÈ÷ "¼º´É(Performance)"À» ³ªÅ¸³¾ ¶§, ÀÀ´ä½Ã°£À» °¡Áö°í ¾ê±âÇÏ´Â °æÇâÀÌ
ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÀ´ä½Ã°£À̶ó´Â °ÍÀº ActiveUser¼ö°¡ Áõ°¡ÇÏ¸é ´ç¿¬È÷ ±×¿¡ µû¶ó
´À·ÁÁö°Ô µË´Ï´Ù. ¹Ý¸é "´ÜÀ§½Ã°£´ç 󸮰Ǽö"ÀÎ TPS(Transaction Per Second) ȤÀº
RPS(Request Per Second)´Â ActiveUser¸¦ Áö¼ÓÀûÀ¸·Î ²ø¾î¿Ã·Á ÀÓ°èÁ¡À» ³Ñ¾î¼¸é,
ƯÁ¤¼öÄ¡ ÀÌ»óÀ» ¿Ã¶ó°¡Áö ¾Ê½À´Ï´Ù. µû¶ó¼ ¼º´ÉÀ» ¾ê±âÇÒ ¶© Æò±ÕÀÀ´ä½Ã°£ÀÌ ¾Æ´Ï¶ó
"´ÜÀ§½Ã°£´ç ÃÖ´ë󸮰Ǽö"¸¦ À̾߱â ÇÏ¼Å¾ß ÇÕ´Ï´Ù.
¼º´É(Performance)ÀÇ Á¤ÀÇ(Definition)Àº "´ÜÀ§½Ã°£´ç ÃÖ´ë󸮰Ǽö"ÀÓÀ» ÁÖÁöÇϼ¼¿ä.
¼º´É¿¡ °ü·ÃÇÑ ÀÌ·ÐÀº ¾Æ·¡ÀÇ ¹®¼¸¦ ÅëÇØ, ÇÔ²² ¿¬±¸ÇϽÃÁö¿ä.
[°ÁÂ]À¥±â¹Ý½Ã½ºÅÛÇÏ¿¡¼ÀÇ ¼º´É¿¡ ´ëÇÑ ÀÌ·ÐÀû °íÂû
http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=consult&c=r_p&n=1008701211
PS: IBM WebSphere V3 ÀÇ °æ¿ì, Connection À» °¡Á®¿Ã ¶§, JNDI¸¦ »ç¿ëÇÏ°Ô µÇ´Âµ¥
À̶§ »ç¿ëµÇ´Â DataSource °´Ã¼¸¦ ¸Å¹ø initialContext.lookup() À» ÅëÇØ °¡Á®¿À°Ô
µÇ¸é, ±Þ°ÝÇÑ ¼º´ÉÀúÇÏ°¡ ÀϾ´Ï´Ù.(NOTE: V4ºÎÅÍ´Â ³»ºÎÀûÀ¸·Î cache¸¦ »ç¿ëÇÏ¿©
¼º´ÉÀÌ º¸´Ù Çâ»óµÇ¾ú½À´Ï´Ù)
DataSource¸¦ ¸Å ¿äû½Ã¸¶´Ù lookup ÇÒ °æ¿ì ´ÙÀ½°ú °°Àº °á°ú¸¦ °¡Á®¿Ô½À´Ï´Ù.
java HttpConn http://localhost/db_pool.jsp -c <µ¿½ÃÀ¯Àú¼ö> -n <È£ÃâȽ¼ö> -s 0
TOTAL(1,10) iteration=10 , average=80.00 (ms), TPS=11.61
TOTAL(50,10) iteration=500 , average=2,468.30 (ms), TPS=16.98
TOTAL(50,10) iteration=500 , average=2,010.43 (ms), TPS=18.18
TOTAL(100,10) iteration=1000 , average=4,377.24 (ms), TPS=18.16
TOTAL(200,10) iteration=1937 , average=8,991.89 (ms), TPS=18.12
TPS °¡ 18 À̴ϱî DataSource Cache ¸¦ »ç¿ëÇÒ ¶§ º¸´Ù 1/3 ¼º´É¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â °ÅÁÒ.
6. JDBC Connection Pooling À» »ç¿ëÇÏ¿© ÄÚµùÇÒ ¶§ °í·Á»çÇ×
JDBC Connecting PoolingÀº JDBC 1.0 ½ºÆå»ó¿¡ ¾ð±ÞµÇ¾î ÀÖÁö ¾Ê¾Ò½À´Ï´Ù. ±×·¯´Ùº¸´Ï
BEA WebLogic, IBM WebSphere, Oracle OAS, Inprise Server, Sun iPlanet µî ¾îÇø®ÄÉ
ÀÌ¼Ç ¼¹ö¶ó°í ºÒ¸®´Â Á¦Ç°µé¸¶´Ù ±× ±¸Çö¹æ½ÄÀÌ ´Þ¶ú½À´Ï´Ù.
ÀÎÅͳݿ¡¼ µ¹¾Æ´Ù´Ï´Â Hans Bergsten ÀÌ ¸¸µç DBConnectionManager.java µµ ±×·¸°í,
JDF ¿¡ Æ÷ÇԵǾî ÀÖ´Â ÆÐÅ°Áöµµ ±×·¸°í °¢ÀÚ µ¶Æ¯ÇÑ ¹æ½ÄÀ¸·Î °³¹ßÀÌ µÇ¾î ÀÖ½À´Ï´Ù.
JDBC¸¦ ÀÌ¿ëÇÏ¿© DB¿¬°áÇÏ´Â ´ëÇ¥ÀûÀÎ ÄÚµù ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.
------------------------------------------------------------------
[BEA WebLogic Application Server]
import java.sql.*;
// Driver loading needed.
static {
try {
Class.forName("weblogic.jdbc.pool.Driver").newInstance();
}
catch (Exception e) {
...
}
}
......
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection("jdbc:weblogic:pool:<pool_name>", null);
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) try{conn.close();}catch(Exception e){}
}
------------------------------------------------------------------
IBM WebSphere Application Server 3.0.2.x / 3.5.x
/* IBM WebSphere 3.0.2.x for JDK 1.1.8 */
//import java.sql.*;
//import javax.naming.*;
//import com.ibm.ejs.dbm.jdbcext.*;
//import com.ibm.db2.jdbc.app.stdext.javax.sql.*;
/* IBM WebSphere 3.5.x for JDK 1.2.2 */
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
// DataSource Cache »ç¿ëÀ» À§ÇÑ ds °´Ã¼ static ÃʱâÈ
private static DataSource ds = null;
static {
try {
java.util.Hashtable props = new java.util.Hashtable();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.ejs.ns.jndi.CNInitialContextFactory");
Context ctx = null;
try {
ctx = new InitialContext(props);
ds = (DataSource)ctx.lookup("jdbc/<data_source_name>");
}
finally {
if ( ctx != null ) ctx.close();
}
}
catch (Exception e) {
....
}
}
.....
Connection conn = null;
Statement stmt = null;
try {
conn = ds.getConnection("userid", "password");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) try{conn.close();}catch(Exception e){}
}
------------------------------------------------------------------
IBM WebSphere Application Server 2.0.x
import java.sql.*;
import com.ibm.servlet.connmgr.*;
// ConnMgr Cache »ç¿ëÀ» À§ÇÑ connMgr °´Ã¼ static ÃʱâÈ
private static IBMConnMgr connMgr = null;
private static IBMConnSpec spec = null;
static {
try {
String poolName = "JdbcDb2"; // defined in WebSphere Admin Console
spec = new IBMJdbcConnSpec(poolName, false,
"com.ibm.db2.jdbc.app.DB2Driver",
"jdbc:db2:<db_name>", // "jdbc:db2://ip_address:6789/<db_name>",
"userid","password");
connMgr = IBMConnMgrUtil.getIBMConnMgr();
}
catch(Exception e){
.....
}
}
.....
IBMJdbcConn cmConn = null; // "cm" maybe stands for Connection Manager.
Statement stmt = null;
try {
cmConn = (IBMJdbcConn)connMgr.getIBMConnection(spec);
Connection conn = jdbcConn.getJdbcConnection();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( cmConn != null ) try{cmConn.releaseIBMConnection();}catch(Exception e){}
}
// NOTE: DO NOT "conn.close();" !!
------------------------------------------------------------------
Oracle OSDK(Oracle Servlet Development Kit)
import java.sql.*;
import oracle.ec.ctx.*;
.....
oracle.ec.ctx.Trx trx = null;
Connection conn = null;
Statement stmt = null;
try {
oracle.ec.ctx.TrxCtx ctx = oracle.ec.ctx.TrxCtx.getTrxCtx();
trx = ctx.getTrx();
conn = trx.getConnection("<pool_name>");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) try{ trx.close(conn,"<pool_name>");}catch(Exception e){}
}
// NOTE: DO NOT "conn.close();" !!
------------------------------------------------------------------
Hans Bergsten ÀÇ DBConnectionManager.java
import java.sql.*;
.....
db.DBConnectionManager connMgr = null;
Connection conn = null;
Statement stmt = null;
try {
connMgr = db.DBConnectionManager.getInstance();
conn = connMgr.getConnection("<pool_name>");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) connMgr.freeConnection("<pool_name>", conn);
}
// NOTE: DO NOT "conn.close();" !!
------------------------------------------------------------------
JDF ÀÇ DB Connection Pool Framework
import java.sql.*;
import com.lgeds.jdf.*;
import com.lgeds.jdf.db.*;
import com.lgeds.jdf.db.pool.*;
private static com.lgeds.jdf.db.pool.JdbcConnSpec spec = null;
static {
try {
com.lgeds.jdf.Config conf = new com.lgeds.jdf.Configuration();
spec = new com.lgeds.jdf.db.pool.JdbcConnSpec(
conf.get("gov.mpb.pbf.db.emp.driver"),
conf.get("gov.mpb.pbf.db.emp.url"),
conf.get("gov.mpb.pbf.db.emp.user"),
conf.get("gov.mpb.pbf.db.emp.password")
);
}
catch(Exception e){
.....
}
}
.....
PoolConnection poolConn = null;
Statement stmt = null;
try {
ConnMgr mgr = ConnMgrUtil.getConnMgr();
poolConn = mgr.getPoolConnection(spec);
Connection conn = poolConnection.getConnection();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( poolConn != null ) poolConn.release();
}
// NOTE: DO NOT "conn.close();" !!
------------------------------------------------------------------
¿©±â¼ ÇÏ°íÇ ¾ê±â´Â DB Connection Pool À» ±¸ÇöÇÏ´Â ¹æ½Ä¿¡ µû¶ó¼ °³¹ßÀÚÀÇ ¼Ò½ºµµ
ÀüºÎ Á¦ °¢±â ´Ù¸¥ API¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
ÇÁ·ÎÁ§Æ®¸¦ ÀÌ°÷ Àú°÷ ¶Ù¾î º» ºÐÀº ¾Æ½Ã°ÚÁö¸¸, ¸Å ÇÁ·ÎÁ§Æ®¸¶³ª ¾îÇø®ÄÉÀÌ¼Ç ¼¹ö°¡
´Ù¸£°í Áö³ ÇÁ·ÎÁ§Æ®¿¡¼ »ç¿ëµÈ ¼Ò½º¸¦ »õ ÇÁ·ÎÁ§Æ®¿¡ ±×´ë·Î Àû¿ëÇÏÁö ¸øÇÏ°Ô µË´Ï´Ù.
JDBC °ü·Ã API°¡ ´Ù¸£±â ¶§¹®ÀÌÁÒ.
°°Àº Á¦Ç°ÀÏÁö¶óµµ ¹öÀü¾÷ÀÌ µÇ¸é¼ API°¡ º¯Çعö¸®´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é,
IBM WebSphere ¹öÀü 2.0.x¿¡¼ ¹öÀü 3.0.x·ÎÀÇ ÀüȯÇÒ ¶§, DB ¿¬°áÀ» À§ÇÑ API°¡
º¯Çعö·Á ±âÁ¸¿¡ °³¹ßÇصР400 ¿©°³ÀÇ ¼Ò½º¸¦ ´Ù ¶â¾î °íÃÄ¾ß ÇÏ´Â °Í°ú °°Àº »óȲÀÌ
¹ú¾îÁú ¼öµµ ÀÖ½À´Ï´Ù.
´åÄľ÷ü¿¡¼ ƯÁ¤ ÆÐÅ°Áö Á¦Ç°À» ¸¸µé¶§µµ ¸¶Âù°¡Áö ÀÔ´Ï´Ù. ÀÚ»çÀÇ Á¦Ç°ÀÌ ¾î¶°ÇÑ
¾îÇø®ÄÉÀÌ¼Ç ¼¹ö¿¡¼ µ¿ÀÛÇϵµ·Ï ÇØ¾ß ÇÏ´À³Ä¿¡ µû¶ó ÄÚµùÇÒ API°¡ ´Þ¶óÁö´Ï ¼Ò½º¸¦
¸Å¹ø º¯°æÇؾ߸¸ ÇÏ°Ú°í, ƯÁ¤ ¾îÇø®ÄÉÀÌ¼Ç ¼¹ö¿¡¸¸ µ¿ÀÛÇÏ°Ô ÇÏ·Á´Ï ¸¶ÄϽÃÀåÀÌ
Á¼¾ÆÁö°Ô µË´Ï´Ù.
IBM WebSphere, BEA WebLogic »Ó¸¸ ¾Æ´Ï¶ó Apache JServ ³ª JRun, ȤÀº Tomcat ¿¡¼µµ
½±°Ô Æ÷ÆÃÇÏ±æ ¿øÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ°ÍÀ» ÇØ°áÇÏ´Â ¹æ¹ýÀº ¿ì¸®µé "SE(System Engineer)"¸¸ÀÇ °íÀ¯ÇÑ "Connection Adapter
Ŭ·¡½º"¸¦ ¸¸µé¾î¼ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.
¿¹¸¦ µé¾î °³¹ßÀÚÀÇ ¼Ò½º´Â ÀÌÁ¦ Ç×»ó ´ÙÀ½°ú °°Àº À¯ÇüÀ¸·Î ÄÚµùµÇ¸é ¾î¶»°Ú½À´Ï±î ?
-----------------------------------------------------------
.....
ConnectionResource resource = null;
Statement stmt = null;
try {
resource = new ConnectionResource();
Connection conn = resource.getConnection();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ....");
while(rs.next()){
.....
}
rs.close();
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( resource != null ) resource.release();
}
// NOTE: DO NOT "conn.close();" !!
-----------------------------------------------------------
ÀÌ ¶§ ConnectionResource ´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ´©±º°¡ ÇѺÐÀÌ ¸¸µé¾î µÎ¸é µÇ°ÚÁÒ.
-----------------------------------------------------------
import java.sql.*;
public class ConnectionResource
{
private java.sql.Connection conn = null;
public ConnectionResource() throws Exception {
......
conn = ..... GET Connection by Connection Pooling API
}
public Connection getConnection() throws Exception {
return conn;
}
public void release(){
// release conn into "Connection Pool"
.......
}
}
-----------------------------------------------------------
¿¹¸¦ µé¾î IBM WebSphere Version 3.0.2.x ÀÇ °æ¿ì¸¦ µç´Ù¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.
-----------------------------------------------------------
package org.jsn.connpool;
/*
* ConnectionResource V 1.0
* JDBC Connection Pool Adapter for IBM WebSphere V 3.0.x/3.5.x
* Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
* Last Modified : 2000.11.10
* NOTICS: You can re-distribute or copy this source code freely,
* you can NOT remove the above subscriptions.
*/
/* IBM WebSphere 3.0.2.x for JDK 1.1.8 */
//import java.sql.*;
//import javax.naming.*;
//import com.ibm.ejs.dbm.jdbcext.*;
//import com.ibm.db2.jdbc.app.stdext.javax.sql.*;
/* IBM WebSphere 3.5.x for JDK 1.2.2 */
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class ConnectionResource
{
private static final String userid = "userid";
private static final String password = "password"
private static final String datasource = "jdbc/<data_source_name>";
private static DataSource ds = null;
private java.sql.Connection conn = null;
public ConnectionResource() throws Exception {
synchronized ( ConnectionResource.class ) {
if ( ds == null ) {
java.util.Hashtable props = new java.util.Hashtable();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.ejs.ns.jndi.CNInitialContextFactory");
Context ctx = null;
try {
ctx = new InitialContext(props);
ds = (DataSource)ctx.lookup("jdbc/<data_source_name>");
}
finally {
if ( ctx != null ) ctx.close();
}
}
}
conn = ds.getConnection( userid, password );
}
public Connection getConnection() throws Exception {
if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
return conn;
}
public void release(){
// release conn into "Connection Pool"
if ( conn != null ) try { conn.close(); }catch(Excepton e){}
conn = null;
}
}
-----------------------------------------------------------
¸¸¾à Hans Bersten ÀÇ DBConnectionManager.java ¸¦ ÀÌ¿ëÇÑ Connection Pool À̶ó¸é
´ÙÀ½°ú °°ÀÌ ¸¸µé¾î ÁÖ¸é µË´Ï´Ù.
-----------------------------------------------------------
package org.jsn.connpool;
import java.sql.*;
public class ConnectionResource
{
private String poolname = "<pool_name>";
private Connection conn = null;
private db.DBConnectionManager connMgr = null;
public ConnectionResource() throws Exception {
connMgr = db.DBConnectionManager.getInstance();
conn = connMgr.getConnection(poolname);
}
public Connection getConnection() throws Exception {
if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
return conn;
}
public void release(){
if ( conn != null ) {
// Dirty TransactionÀ» rollback½ÃÅ°´Â ºÎºÐÀε¥, »ý·«Çϼŵµ µË´Ï´Ù.
boolean autoCommit = true;
try{ autoCommit = conn.getAutoCommit(); }catch(Exception e){}
if ( autoCommit == false ) {
try { conn.rollback(); }catch(Exception e){}
try { conn.setAutoCommit(true); }catch(Exception e){}
}
connMgr.freeConnection(poolname, conn);
conn = null;
}
}
}
-----------------------------------------------------------
¶Ç, Resin 1.2.x ÀÇ °æ¿ì¶ó¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.
-----------------------------------------------------------
package org.jsn.connpool;
/*
* ConnectionResource V 1.0
* JDBC Connection Pool Adapter for Resin 1.2.x
* Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
* Last Modified : 2000.10.18
* NOTICS: You can re-distribute or copy this source code freely,
* you can NOT remove the above subscriptions.
*/
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class ConnectionResource
{
private static final String datasource = "jdbc/<data_source_name>";
private static final String userid = "userid";
private static final String password = "password"
private static DataSource ds = null;
private java.sql.Connection conn = null;
public ConnectionResource() throws Exception {
synchronized ( ConnectionResource.class ) {
if ( ds == null ) {
Context env = (Context) new InitialContext().lookup("java:comp/env");
ds = (DataSource) env.lookup(datasource);
}
}
conn = ds.getConnection( userid, password );
}
public Connection getConnection() throws Exception {
if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
return conn;
}
public void release(){
// release conn into "Connection Pool"
if ( conn != null ) try { conn.close(); }catch(Excepton e){}
conn = null;
}
}
-----------------------------------------------------------
Oracle 8i(8.1.6ÀÌ»ó)¿¡¼ OracleÀÇ JDBC 2.0 Driver ÀÚü°¡ Á¦°øÇÏ´Â Connection
PoolÀ» ÀÌ¿ëÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ µÉ °Ì´Ï´Ù.
-----------------------------------------------------------
package org.jsn.connpool;
/*
* ConnectionResource V 1.0
* JDBC Connection Pool Adapter for Oracle JDBC 2.0
* Author: WonYoung Lee, javaservice@hanmail.net, 011-898-7904
* Last Modified : 2001.10.29
* NOTICS: You can re-distribute or copy this source code freely,
* but you can NOT remove the above subscriptions.
*/
import java.sql.*;
import javax.sql.*;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;
public class ConnectionResource
{
private static final String dbUrl = "jdbc:oracle:thin@192.168.0.1:1521:ORCL";
private static final String userid = "userid";
private static final String password = "password"
private static OracleConnectionCacheImpl oraclePool = null;
private static boolean initialized = false;
private java.sql.Connection conn = null;
public ConnectionResource() throws Exception {
synchronized ( ConnectionResource.class ) {
if ( initialized == false ) {
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
oraclePool = new OracleConnectionCacheImpl();
oraclePool.setURL(dbUrl);
oraclePool.setUser(userid);
oraclePool.setPassword(password);
oraclePool.setMinLimit(10);
oraclePool.setMaxLimit(50);
//oraclePool.setCacheScheme(OracleConnectionCacheImpl.FIXED_WAIT_SCHEME);
// FIXED_WAIT_SCHEME(default), DYNAMIC_SCHEME, FIXED_RETURN_NULL_SCHEME
//oraclePool.setStmtCacheSize(0); //default is 0
initialized = true;
}
}
conn = oraclePool.getConnection();
}
public Connection getConnection() throws Exception {
if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
return conn;
}
public void release(){
// release conn into "Connection Pool"
if ( conn != null ) try { conn.close(); }catch(Exception e){}
conn = null;
}
}
-----------------------------------------------------------
¶ÇÇÑ ¼³·É Connection Pool ±â´ÉÀ» Áö±ÝÀ» »ç¿ëÄ¡ ¾Ê´õ¶óµµ ÇâÈÄ¿¡ Àû¿ëÇÒ °èȹÀÌ
ÀÖ´Ù¸é, ¿ì¼±Àº ´ÙÀ½°ú °°Àº Connection Adapter Ŭ·¡½º¸¦ ¹Ì¸® ¸¸µé¾î µÎ°í À̸¦
»ç¿ëÇÏ´Â °ÍÀÌ È¿°úÀûÀÔ´Ï´Ù. ÇâÈÄ¿¡ ÀÌ Å¬·¡½º¸¸ °íÃÄÁÖ¸é µÇ´Ï±î¿ä.
Oracle Thin Driver¸¦ »ç¿ëÇÏ´Â °æ¿ìÀÔ´Ï´Ù.
-----------------------------------------------------------
import java.sql.*;
public class ConnectionResource
{
private static final String userid = "userid";
private static final String password = "password"
private static final String driver = "oracle.jdbc.driver.OracleDriver"
private static final String url = "jdbc:oracle:thin@192.168.0.1:1521:ORCL";
private static boolean initialized = false;
private java.sql.Connection conn = null;
public ConnectionResource() throws Exception {
synchronized ( ConnectionResource.class ) {
if ( initialized == false ) {
Class.forName(driver);
initialized = true;
}
}
conn = DriverManager.getConnection( url, userid, password );
}
public Connection getConnection() throws Exception {
if ( conn == null ) throw new Exception("Connection is NOT avaiable !!");
return conn;
}
public void release(){
if ( conn != null ) try { conn.close(); }catch(Excepton e){}
conn = null;
}
}
-----------------------------------------------------------
ÇÁ·Î±×·¥ÀÇ À¯ÇüÀ̳ª, Ŭ·¡½º À̸§ÀÌ¾ß ¹¹µç »ó°ü¾ø½À´Ï´Ù. À§Ã³·³ ¿ì¸®µé¸¸ÀÇ °íÀ¯ÇÑ
"Connection Adapter Ŭ·¡½º"¸¦ ¸¸µé¾î¼ »ç¿ëÇÑ´Ù´Â °ÍÀÌ Áß¿äÇÏ°í, ¸¸¾à ¾îÇø®ÄÉÀ̼Ç
¼¹ö°¡ º¯°æµÈ´Ù°Å³ª, DB Connection Pooling ¹æ½ÄÀÌ ´Þ¶óÁö¸é ÇØ´ç ConnectionResource
Ŭ·¡½º ³»¿ë¸¸ »ì¦ °íÃÄÁÖ¸é °³¹ßÀÚÀÇ ¼Ò½º´Â ÀüÇô °íÄ¡Áö ¾Ê¾Æµµ µÉ °ÍÀÔ´Ï´Ù.
NOTE: ConnectionResource Ŭ·¡½º¸¦ ¸¸µé¶§ ÁÖÀÇÇÒ °ÍÀº Àý´ë Exception À» Ŭ·¡½º ³»ºÎ¿¡¼
°¡·Îä¾î ¹«½ÃÇÏ°Ô ÇÏÁö ¸»¶ó´Â °ÍÀÔ´Ï´Ù. ±×³É ±×´ë·Î throw °¡ ÀϾ°Ô ±¸ÇöÇϼ¼¿ä.
ÀÌ·¸°Ô Çϼž߸¸ °³¹ßÀÚÀÇ ¼Ò½º¿¡¼ "Exception ó¸®"¸¦ ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.
NOTE2: ConnectionResource Ŭ·¡½º¸¦ ¸¸µé¶§ ¹Ýµå½Ã package ¸¦ ¼±¾ðÇϵµ·Ï Çϼ¼¿ä.
IBM WebSphere 3.0.x ÀÇ °æ¿ì JSP¿¡¼ "¼ºí·¿Å¬·¡½ºÆнº"¿¡ °É·Á Àִ Ŭ·¡½º¸¦
ÂüÁ¶ÇÒ ¶§, ±× Ŭ·¡½º°¡ default package Áï package °¡ ¾ø´Â Ŭ·¡½ºÀÏ °æ¿ì ÂüÁ¶ÇÏÁö
¸øÇÏ´Â ¹ö±×°¡ ÀÖ½À´Ï´Ù. Åë»ó "Bean"À̶ó ºÒ¸®´Â Ŭ·¡½º ¿ª½Ã Á¶°Ç¿¡ µû¶ó ÀνÄÇÏÁö
¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.
Ŭ·¡½º ´ÙÁöÀÎ ¹× ¼³°è »óÀ¸·Î º¸´õ¶óµµ package ¸¦ ¼±¾ðÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù.
NOTE3: À§¿¡¼ "userid", "password" µî°ú °°ÀÌ ¸í½ÃÀûÀ¸·Î ÇÁ·Î±×·¥¿¡ ¹Ú¾Æ ³ÖÁö
¾Ê°í, ÆÄÀÏ·Î °ü¸®Çϱ⸦ ¿øÇÑ´Ù¸é, ±×·¸°Ô Çϼŵµ µË´Ï´Ù.
JDFÀÇ Configuration Framework À» ÂüÁ¶Çϼ¼¿ä.
PS: ȤÀÚ´Â ¿Ö ConnectionResource ÀÇ release() ¸Þ¼Òµå°¡ ÇÊ¿äÇÏ³Ä°í ¹Ý¹®ÇÒ ¼öµµ ÀÖ½À
´Ï´Ù. ¿¹¸¦ µé¾î °³¹ßÀÚÀÇ ¼Ò½º°¡ ´ÙÀ½Ã³·³ µÇµµ·Ï Çصµ µÇÁö ¾Ê´À³Ä¶ó´Â °ÅÁÒ.
-----------------------------------------------------------
.....
Connection conn = null;
Statement stmt = null;
try {
conn = ConnectionResource.getConnection(); // <---- !!!
stmt = conn.createStatement();
.....
}
catch(Exception e){
.....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) try{conn.close();}catch(Exception e){} // <---- !!!
}
-----------------------------------------------------------
ÀÌ·¸°Ô Çϼŵµ Å« ¹«¸®´Â ¾ø½À´Ï´Ù. ±×·¯³ª, JDBC 2.0 À» Áö¿øÇÏ´Â Á¦Ç°¿¡¼¸¸
conn.close() ¸¦ ÅëÇØ ÇØ´ç Connection À» ½ÇÁ¦ close() ½ÃÅ°´Â °ÍÀÌ ¾Æ´Ï¶ó DB Pool¿¡
¹ÝȯÇÏ°Ô µË´Ï´Ù. BEA WebLogic À̳ª IBM WebSphere 3.0.2.x, 3.5.x µîÀÌ ±×·¸½À´Ï´Ù.
±×·¯³ª, ÀÚüÁ¦ÀÛµÈ ´ëºÎºÐÀÇ DB Connection Pool ±â´ÉÀº Connection À» DB Pool¿¡
¹ÝȯÇÏ´Â °íÀ¯ÇÑ API¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. WebSphere Version 2.0.x ¿¡¼´Â
cmConn.releaseIBMConnection(), Oracle OSDK ¿¡¼´Â trx.close(conn, "<pool_name">);
Hans Bersten ÀÇ DBConnectionManager ÀÇ °æ¿ì´Â
connMgr.freeConnection(poolname, conn); µîµî ¼·Î ´Ù¸¨´Ï´Ù. ÀÌ·¯ÇÑ Á¦Ç°µé±îÁö
¸ðµÎ Áö¿øÇÏ·Á¸é "release()" ¶ó´Â ¿ì¸®µé(!)¸¸ÀÇ ¿¹¾àµÈ ¸Þ¼Òµå°¡ ²À ÇÊ¿äÇÏ°Ô µË´Ï´Ù.
¹°·Ð, java.sql.Connection Interface¸¦ implements ÇÑ º°µµÀÇ MyConnection À» ¸¸µé¾î
µÎ°í, ½ÇÁ¦ java.sql.Connection À» ¾òÀº ÈÄ MyConnectionÀÇ »ý¼ºÀÚ¿¡ ±× reference¸¦
³Ö¾îÁØ ÈÄ, À̸¦ return ½Ã¿¡ ³Ñ±âµµ·Ï ÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̶§, MyConnectionÀÇ
close() ÇÔ¼ö¸¦ ¾à°£ °³Á¶ÇÏ¿© DB Connection Pool·Î µ¹¾Æ°¡°Ô ÇÒ ¼ö ÀÖÀ¸´Ï±î¿ä.
PS: Çϳª ÀÌ»óÀÇ DB ¸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é, ´ÙÀ½°ú °°Àº »ý¼ºÀÚ¸¦ Ãß°¡·Î ¸¸µé¾î¼ ±¸ºÐÄÉ
ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
-----------------------------------------------------------
....
private String poolname = "default_pool_name";
private String userid = "scott";
private String password = "tiger";
public ConnectionResource() throws Exception {
initialize();
}
public ConnectionResource(String poolname) throws Exception {
this.poolname = poolname;
initialize();
}
public ConnectionResource(String poolname,String userid, String passwrod)
throws Exception
{
this.poolname = poolname;
this.userid = userid;
this.password = password;
initialize();
}
private void initialize() throws Exception {
....
}
...
-----------------------------------------------------------
-------------------------------------------------------------------------------
2001.03.20 Ãß°¡
2001.10.22 ¼öÁ¤
2001.11.09 ¼öÁ¤(¾Æ·¡ ¼³¸íÀ» Ãß°¡ÇÔ)
½Ç ¿î¿µ »çÀÌÆ®ÀÇ Àå¾ÖÁø´Ü ¹× Æ©´×À» ´Ù³àº¸¸é, Àå¾ÖÀÇ ¿øÀÎÀÌ DataBase ¿¬°á°³¼ö°¡
Áö¼ÓÀûÀ¸·Î Áõ°¡ÇÏ°í, Connection Pool ¿¡¼ ´õÀÌ»ó °¡¿ëÇÑ ¿¬°áÀÌ ³²¾Æ ÀÖÁö ¾Ê¾Æ
¹ß»ýÇÏ´Â ¹®Á¦°¡ ÀÇ¿Ü·Î ¸¹½À´Ï´Ù. ÀÌ »óȲÀÇ ½ÊÁßÆȱ¸´Â °³¹ßÀÚÀÇ Äڵ忡¼ Pool·Î
ºÎÅÍ °¡Á®¿Â DB¿¬°áÀ» »ç¿ëÇÏ°í ³ ÈÄ, À̸¦ ¿©ÇÏÇÑÀÇ Exception »óȲ¿¡¼µµ ´Ù½Ã
Pool·Î µ¹·Áº¸³»¾ß ÇÑ´Ù´Â Rule ¸¦ ÁöÅ°Áö ¾Ê¾Æ¼ ¹ß»ýÇÑ ¹®Á¦°¡ ŹÝÀÔ´Ï´Ù.
À̸§¸¸ ¸»ÇÏ¸é ´©±¸³ª ¾Ë¹ýÇÑ ÅÁ÷ÇÑ ±ÝÀ¶/¹ðÅ·»çÀÌÆ®ÀÇ ÇÁ·Î±×·¥¼Ò½º¿¡¼µµ ¸¶Âù°¡Áö
ÀÔ´Ï´Ù.
¹®Á¦´Â ºÐ¸íÈ÷ ¾î¶² ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼ DB Connection À» Á¦´ë·Î ¹ÝȯÇÏÁö ¾ÊÀº
°ÍÀº ºÐ¸íÇѵ¥, ±× "¾î¶² ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥"ÀÌ ²ÀÁý¾î ¹¹³Ä ¶ó´Â °ÍÀ» ã¾Æ³»±â¶õ
Á¤¸» ½±Áö ¾Ê½À´Ï´Ù. Á¤¸» ½±Áö ¾Ê¾Æ¿ä. 1ÃÊ´ç ¼ö½Ê°³¾¿ÀÇ Request °¡ ´Ù¾çÇÏ°Ô µé¾î
¿À´Â »óȲ¿¡¼, "netstat -n"À¸·Î º¸ÀÌ´Â TCP/IP ·¹º§¿¡¼ÀÇ DB¿¬°á¼ö´Â ºÐ¸íÈ÷ Áõ°¡
ÇÏ°í Àִµ¥, ±× ¼ö½Ê°³ Áß ¾î¶² °ÍÀÌ ¹®Á¦¸¦ ¾ß±âÇÏ´À³Ä¸¦ µµÀúÈ÷ ¸øã°Ú´Ù´Â °ÍÀÌÁö¿ä.
»ç¿ëÀÚ°¡ ¾Æ¹«µµ ¾ø´Â »õº®¿¡ Çϳª¾¿ ÄÁÅÙÃ÷¸¦ ²À²À ´·¯ º»µé, ±× ¹®Á¦ÀÇ »óȲÀº
´ëºÎºÐ Á¤»óÀûÀÎ ·ÎÁ÷ flow ¿¡¼´Â ³ªÅ¸³ªÁö ¾Ê°í, ¾î¶² Ưº°ÇÑ Á¶°Ç, ȤÀº ¾î¶²
Exception ÀÌ ¹ß»ýÇÒ ¶§¸¸ ³ªÅ¸³¯ ¼ö Àֱ⠶§¹®¿¡, ÀÌ·± ¹æ¹ýÀ¸·Î´Â ¼Õ¹ß°ú ´«¸¸ ¾ÆÇÁ°Ô
µÇ°ï ÇÕ´Ï´Ù.
µû¶ó¼, ¾ÖÃÊ ºÎÅÍ, ÀÌ·¯ÇÑ »óȲÀ» °í·ÁÇÏ¿©, ¸¸¾à, °³¹ßÀÚÀÇ Äڵ忡¼ ½Ç¼ö·Î DB¿¬°áÀ»
Á¦´ë·Î Pool ¿¡ ¹ÝȯÇÏÁö ¾Ê¾ÒÀ» ¶§, ±× °³¹ßÀÚ ÇÁ·Î±×·¥ ¼Ò½ºÀÇ Å¬·¡½º À̸§°ú ÇÔ²²
Warnning ¼º ¸Þ¼¼Áö¸¦ ³²°Ü ³õÀ¸¸é, µÇÁö ¾Ê°Ú´À³Ä´Â °Ì´Ï´Ù.
Java ¿¡¼´Â java.lang.Object ÀÇ finalize() ¶ó´Â ±â¸·ÇÑ ¸Þ¼Òµå°¡ ÀÖ½À´Ï´Ù. ÇØ´ç
Object instanceÀÇ reference °¡ ´õÀÌ»ó ±× ¾î¶² Thread ¿¡µµ ³²¾Æ ÀÖÁö ¾ÊÀ» °æ¿ì
JVMÀÇ GC°¡ ÀϾ ¶§ ±× Object ÀÇ finalize() ¸Þ¼Òµå¸¦ ²À Çѹø ºÒ·¯Áִϱî¿ä.
°è¼Ó ¹Ýº¹µÇ´Â ¾ê±âÀε¥, ¾Æ·¡ ±Û¿¡¼ ¶ÇÇѹø °ü·Ã Àǹ̸¦ ãÀ» ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
Re: DB Connection Pool: Orphan and Idle Timeout
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=1005294960
¾Æ·¡´Â ÀÌ°ÍÀ» ÀÀ¿ëÇÏ¿©, Hans Bergsten ÀÇ DBConnectionManager ¸¦ »ç¿ëÇÏ´Â
ConnectionAdapter Ŭ·¡½º¸¦ ¸¸µé¾î º» »ùÇÃÀÔ´Ï´Ù. Trace/Debuging À» À§ÇÑ ¸î°¡Áö
±â´ÉÀÌ Ã·°¡µÇ¾î ÀÖÀ¸¸ç, ´Ù¸¥ ConnectionPoolÀ» À§ÇÑ Connection Adapter ¸¦ ¸¸µé¶§µµ
¾à°£¸¸ ¼öÁ¤/ÀÀ¿ëÇÏ¿© »ç¿ëÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
/**
* Author : Lee WonYoung, javaservice@hanmail.net
* Date : 2001.03.20, 2001.10.22
*/
import java.util.*;
import java.sql.*;
import java.io.*;
import java.text.SimpleDateFormat;
public class ConnectionResource
{
private boolean DEBUG_MODE = true;
private String DEFAULT_DATASOURCE = "idb"; // default db name
private long GET_CONNECTION_TIMEOUT = 2000; // wait only 2 seconds if no
// avaiable connection in the pool
private long WARNNING_MAX_ELAPSED_TIME = 3000;
private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd/HHmmss");
private db.DBConnectionManager manager = null;
private Connection conn = null;
private String datasource = DEFAULT_DATASOURCE;
private String caller = "unknown";
private long starttime = 0;
private static int used_conn_count = 0;
private static Object lock = new Object();
// detault constructor
public ConnectionResource()
{
manager = db.DBConnectionManager.getInstance();
}
// For debugging, get the caller object reference
public ConnectionResource(Object caller_obj)
{
this();
if ( caller_obj != null )
caller = caller_obj.getClass().getName();
}
public Connection getConnection() throws Exception
{
return getConnection(DEFAULT_DATASOURCE);
}
public Connection getConnection(String datasource) throws Exception
{
if ( conn != null ) throw new Exception
("You must release the connection first to get connection again !!");
this.datasource = datasource;
// CONNECTION_TIMEOUT is very important factor for performance tuning
conn = manager.getConnection(datasource, GET_CONNECTION_TIMEOUT);
synchronized( lock ) { ++used_conn_count; }
starttime = System.currentTimeMillis();
return conn;
}
// you don't have to get "connection reference" as parameter,
// because we already have the referece as the privae member variable.
public synchronized void release() throws Exception {
if ( conn == null ) return;
// The following is needed for some DB connection pool.
boolean mode = true;
try{
mode = conn.getAutoCommit();
}catch(Exception e){}
if ( mode == false ) {
try{conn.rollback();}catch(Exception e){}
try{conn.setAutoCommit(true);}catch(Exception e){}
}
manager.freeConnection(datasource, conn);
conn = null;
int count = 0;
synchronized( lock ) { count = --used_conn_count; }
if ( DEBUG_MODE ) {
long endtime = System.currentTimeMillis();
if ( (endtime-starttime) > WARNNING_MAX_ELAPSED_TIME ) {
System.err.println(df.format(new java.util.Date()) +
":POOL:WARNNING:" + count +
":(" + (endtime-starttime) + "):" +
"t" + caller
);
}
}
}
// finalize() method will be called when JVM's GC time.
public void finalize(){
// if "conn" is not null, this means developer did not release the "conn".
if ( conn != null ) {
System.err.println(df.format(new java.util.Date()) +
":POOL:ERROR connection was not released:" +
used_conn_count + ":t" + caller
);
release();
}
}
}
-------------------------------------------------------------------------------
À§ÀÇ Connection Adaptor Ŭ·¡½º¸¦ Servlet À̳ª JSP¿¡¼ »ç¿ëÇÒ ¶§´Â ´ÙÀ½°ú °°ÀÌ
»ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
»ç¿ë¹ý: DB Transaction 󸮰¡ ÇÊ¿äÄ¡ ¾ÊÀ» ¶§...
ConnectionResource resource = null;
Connection conn = null;
Statement stmt = null;
try{
// For debugging and tracing, I recommand to send caller's reference to
// the adapter's constructor.
resource = new ConnectionResource(this); // <--- !!!
//resource = new ConnectionResource();
conn = resource.getConnection();
// or you can use another database name
//conn = resource.getConnection("other_db");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ...");
while(rs.next()){
.....
}
rs.close();
}
//catch(Exception e){
// // error handling if you want
// ....
//}
finally{
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) resource.release(); // <--- !!!
}
-------------------------------------------------------------------------------
»ç¿ë¹ý: Transaction 󸮰¡ ÇÊ¿äÇÒ ¶§.
ConnectionResource resource = null;
Connection conn = null;
Statement stmt = null;
try{
// For debugging and tracing, I recommand to send caller's reference to
// the adapter's constructor.
resource = new ConnectionResource(this);
//resource = new ConnectionResource();
conn = resource.getConnection();
// or you can use another database name
//conn = resource.getConnection("other_db");
conn.setAutoCommit(false); // <--- !!!
stmt = conn.createStatement();
stmt.executeUpdate("update ...");
stmt.executeUpdate("insert ...");
stmt.executeUpdate("update ...");
stmt.executeUpdate("insert ...");
stmt.executeUpdate("update ...");
int affected = stmt.executeUpdate("update....");
// depends on your business logic,
if ( affected == 0 )
throw new Exception("NoAffectedException");
else if ( affected > 1 )
throw new Exception("TooManyAffectedException:" + affected);
conn.commit(); //<<-- commit() must locate at the last position in the "try{}"
}
catch(Exception e){
// if error, you MUST rollback
if ( conn != null ) try{conn.rollback();}catch(Exception e){}
// another error handling if you want
....
throw e; // <--- throw this exception if you want
}
finally{
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) resource.release(); // <-- NOTE: autocommit mode will be
// initialized
}
-----------------------------------------------------------------
PS: ´õ ±íÀÌÀÖ´Â ³»¿ëÀ» ¿øÇÏ½Ã¸é ´ÙÀ½ ¹®¼µéÀ» ÂüÁ¶ Çϼ¼¿ä...
JDF Á¦4ź - DB Connection Pool
http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945156790
JDF Á¦5ź - DB Connection Resource Framework
http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945335633
JDF Á¦6ź - Transactional Connection Resource Framework
http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=framework&c=r_p&n=945490586
PS: IBM WebSphereÀÇ JDBC Connection Pool ¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é ´ÙÀ½ ¹®¼µµ ²À ÂüÁ¶
Çϼ¼¿ä...
Websphere V3 Connection Pool »ç¿ë¹ý
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=970209527
WebSphere V3 DB Connection Recovery ±â´É °íÂû
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=967473008
-------------------------------------------------------
º» ¹®¼´Â ÀÚÀ¯·Ó°Ô ¹èÆ÷/º¹»ç ÇÒ ¼ö ÀÖÀ¸³ª ¹Ýµå½Ã
ÀÌ ¹®¼ÀÇ ÀúÀÚ¿¡ ´ëÇÑ ¾ð±ÞÀ» »èÁ¦ÇÏ½Ã¸é ¾ÈµË´Ï´Ù
================================================
ÀÚ¹Ù¼ºñ½º³Ý ÀÌ¿ø¿µ
E-mail: javaservice@hanmail.net
PCS:011-898-7904
================================================
* iWiz´Ô¿¡ ÀÇÇؼ °Ô½Ã¹° À̵¿µÇ¾ú½À´Ï´Ù (2010-02-03 16:57) |
|


|
 |
 |
 |
 |
iWiz ShareBase, ¨ÏCopyleft by iWiz.
For more information contact
.
|
º» À¥»çÀÌÆ®¿¡ °Ô½ÃµÈ À̸ÞÀÏ ÁÖ¼Ò°¡ ÀüÀÚ¿ìÆí ¼öÁý ÇÁ·Î±×·¥À̳ª
±× ¹ÛÀÇ ±â¼úÀû ÀåÄ¡¸¦ ÀÌ¿ëÇÏ¿© ¹«´ÜÀ¸·Î ¼öÁýµÇ´Â °ÍÀ» °ÅºÎÇϸç,
À̸¦ À§¹Ý½Ã¿¡´Â Á¤º¸Åë½Å¸Á¹ý¿¡ ÀÇÇØ Çü»çó¹úµÊÀ» À¯³äÇϽñ⠹ٶø´Ï´Ù.
[°Ô½ÃÀÏ 2004. 1. 31]
|
|
 |
 |
 |
 |
|
|