CORE
HOME > JAVA > J2SE > CORE
2017.03.21 / 20:33

DBCP(DataBase Connection Pool)ÀÇ »ç¿ë - Java Application

½ºÅÚ¶ó
Ãßõ ¼ö 284

[Æß] : http://blog.naver.com/PostView.nhn?blogId=10353&logNo=10022595461&redirect=Dlog&widgetTypeCall=true

 

DBCP(DataBase Connection Pool)ÀÇ »ç¿ë - Java Application
<BASE target="_son">

DBCP(DataBase Connection Pool)ÀÇ »ç¿ë - Java Application
[01] DBCP(DataBase Connection Pool)ÀÇ »ç¿ë
- ´Ù¿î·Îµå:
http://jakarta.apache.org
- DBCP: DBCP ±¸Çö Liarary
http://jakarta.apache.org/site/downloads/downloads_commons-dbcp.cgi
commons-dbcp-1.2.1.jar
- Commons Collections: Collection Framework ±¸Çö
http://jakarta.apache.org/site/downloads/downloads_commons-collections.cgi
commons-collections-3.1.jar
- Commons Pool: °´Ã¼ ¹öÆÛ¸µ ¶óÀ̺귯¸® ±¸Çö
http://jakarta.apache.org/site/downloads/downloads_commons-pool.cgi
commons-pool-1.2.jar
1. DBCP±¸Çö
>>>>> DBCPConnectionMgr.java
package phonecalc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.impl.GenericObjectPool;
public class DBCPConnectionMgr {
String jdbcDriver="oracle.jdbc.driver.OracleDriver";
String jdbcURL="jdbc:oracle:thin:@172.16.11.1:1521:ora10g2";
String user="ejb2030_04_1";
String password = "oracle";

/**
* »ý¼ºÀÚ
*
*/
public DBCPConnectionMgr() {
super();
try{
setupDriver(jdbcDriver, jdbcURL, user, password);
}catch(Exception ex){
ex.printStackTrace();
}
}
/**
* ConnectionÀ» ¸®ÅÏÇÔ
* @return
*/
public Connection getConnection(){
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:apache:commons:dbcp:ora10g2");
} catch(SQLException ex) {
ex.printStackTrace();
} finally {
}
return con;
}

/**
* Connection ¼³Á¤
* @param jdbcDriver
* @param jdbcURL
* @param user
* @param password
* @throws Exception
*/
public void setupDriver(String jdbcDriver,
String jdbcURL,
String user,
String password) throws Exception {
// JDBC µå¶óÀ̹ö ·Îµù
Class.forName(jdbcDriver);

// Connection Pool »ý¼º
GenericObjectPool connectionPool = new GenericObjectPool(null);
connectionPool.setMaxActive(20); //ÃÖ´ë 20°³ Á¢¼Ó Áö¿ø
connectionPool.setMaxIdle(5); //5°³ ´ë±âÁß ¼³Á¤

// ½ÇÁ¦ DB¿ÍÀÇ Ä¿³Ø¼ÇÀ» ¿¬°áÇØÁÖ´Â ÆÑÅ丮 »ý¼º
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
jdbcURL, // JDBC URL
user, // »ç¿ëÀÚ
password);

// Connection PoolÀÌ PoolableConnection °´Ã¼¸¦ »ý¼ºÇÒ ¶§ »ç¿ëÇÒ
// PoolableConnectionFactory »ý¼º
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory,
connectionPool,
null, // statement pool
null, // Ä¿³Ø¼Ç Å×½ºÆ® Äõ¸®: Ä¿³Ø¼ÇÀÌ À¯È¿ÇÑÁö Å×½ºÆ®ÇÒ ¶§ »ç¿ëµÇ´Â Äõ¸®.
false, // read only ¿©ºÎ
true); // auto commit ¿©ºÎ

// PoolingÀ» À§ÇÑ JDBC µå¶óÀ̹ö »ý¼º ¹× µî·Ï
PoolingDriver driver = new PoolingDriver();

// JDBC µå¶óÀ̹ö¿¡ Ä¿³Ø¼Ç Ç® µî·Ï
driver.registerPool("ora10g2", connectionPool);
}

public void freeConnection(Connection con, PreparedStatement pstmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
freeConnection(con);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(Connection con, Statement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
freeConnection(con);
} catch (SQLException e) {
e.printStackTrace();
}
}

public void freeConnection(Connection con, PreparedStatement pstmt) {
try {
if (pstmt != null) pstmt.close();
freeConnection(con);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(Connection con, Statement stmt) {
try {
if (stmt != null) stmt.close();
freeConnection(con);
} catch (SQLException e) {
e.printStackTrace();
}
}

public void freeConnection(Connection con) {
try {
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void freeConnection(Statement stmt) {
try {
if (stmt != null) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void freeConnection(PreparedStatement pstmt) {
try {
if (pstmt != null) pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(ResultSet rs) {
try {
if (rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

2. DBCP JAVA Test
>>>>> DBCP_Test.java
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import phonecalc.DBCPConnectionMgr;
public class DBCP_Test {

public static void main(String[] args) {
DBCPConnectionMgr dbcp = new DBCPConnectionMgr();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql="SELECT count(*) as cnt FROM tab";

try{
con = dbcp.getConnection();
pstmt = con.prepareStatement(sql);

rs = pstmt.executeQuery();
if (rs.next()){
System.out.println(rs.getInt("cnt"));
}
}catch(Exception e){
System.out.println(e);
}finally{
dbcp.freeConnection(con, pstmt, rs);
}
}
}

 

 

Ãß°¡

[Æß] : http://godpage.tistory.com/236

 

GenericObjectPoolÀÇ ¼³Á¤¿¡ °üÇÑ ¸Þ¸ðÀÌ´Ù.
¾Æ·¡ÀÇ »çÀÌÆ®¿¡¼­ ¹ø¿ªÇØ ¿Â ³»¿ëÀÓÀ» ¹àÈù´Ù.
´©±º°¡ ¹ú½á ÇسùÀ»Áöµµ ¸ð¸£Áö¸¸..
http://commons.apache.org/pool/apidocs/org/apache/commons/pool/impl/GenericObjectPool.html

¼³Á¤°¡´ÉÇÑ ObjectPoolÀÇ ±¸Çöü


ÀûÀýÇÑ PoolableObjectFactory°ú °ü·ÃÇÏ¿© GenericObjectPoolÀº
ÀÓÀÇÀÇ ¿ÀºêÁ§Æ®¿¡°Ô °ß°íÇÑ Ç®¸µÀ» ±â´ÉÀûÀ¸·Î Á¦°øÇÑ´Ù.

GenericObjectPoolÀº ¼ö¸¹Àº ¼³Á¤°¡´ÉÇÑ ÆĶó¸ÞÅ͸¦ Á¦°øÇÑ´Ù.

* maxActive : ÁÖ¾îÁø ½Ã°£¿¡¼­ÀÇ Ç®(Ŭ¶óÀ̾ðÆ®°¡ º¸°íÀְųª, ´ë±â»óÅ¿¡ ÀÖ´Â)¿¡ ÀÇÇØ ÇÒ´çµÇ¾î °ü¸®µÇ´Â¿ÀºêÁ§Æ®ÀÇ ÃÖ´ë¼ö. ¼³Á¤ÀÌ ¾ç¼ö°¡ ¾Æ´Ñ°æ¿ì¿¡´Â Çѹø¿¡ Ç®¿¡¼­ °ü¸®µÉ ¼ö ÀÖ´Â ¿ÀºêÁ§Æ®ÀÇ ¼ýÀÚ¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù. ¿ÀºêÁ§Æ®ÀÇ ¼ö°¡ maxActive¿¡ ´Ù´Ù¸¥ °æ¿ì, Ç®Àº °í°¥µÇ¾ú´Ù¶ó°í ¸»ÇÑ´Ù. ±âº» ¼³Á¤Àº 8ÀÌ´Ù.

* maxIdle : ¾î¶°ÇÑ ½Ã°£¿¡ Ç®¿¡¼­ ´ë±â»óÅ·Π°ü¸®µÇ¾î Áú¼ö ÀÖ´Â ÃÖ´ë ¼öÀÌ´Ù. À½¼öÀΰæ¿ì¿¡´Â Ç®¿¡¼­ ´ë±â»óÅ·ΠÀÖ´Â ¿ÀºêÁ§Æ®ÀÇ ¼ö¿¡ Á¦ÇÑÀÌ ¾ø´Â°ÍÀ¸·Î °£ÁÖÇÑ´Ù. ±âº»¼³Á¤Àº 8ÀÌ´Ù.

* whenExhaustedAction : borrowObject() ½ÇÇà½Ã Ç®ÀÌ °í°¥µÇ¾úÀ»¶§ÀÇ ÇൿÀ» ÁöÁ¤ÇÑ´Ù.

* WHEN_EXHAUSTED_FAIL, borrowObject() Àΰæ¿ì NoSuchElementExcptionÀ» ´øÁú°ÍÀÌ´Ù.

* WHEN_EXHAUSTED_GROW, borrowObject() Àΰæ¿ì »õ·Î¿î ¿ÀºêÁ§Æ®¸¦ ¸¸µé°í ±×°ÍÀ» ¸®ÅÏÇÑ´Ù.
(±Ùº»ÀûÀ¸·Î maxActive°¡ Àǹ̰¡ ¾ø¾îÁø´Ù. )

* WHEN_EXHAUSTED_BLOCK, borrowObject() Àΰæ¿ì »õ ¿ÀºêÁ§Æ®È¤Àº ´ë±â¿ÀºêÁ§Æ®°¡ »ç¿ë°¡´ÉÇØ Áú¶§±îÁö ºí·°- Object.wait()¸¦ È£Ãâ - ½ÃŲ´Ù. maxWait°ªÀÌ ¾ç¼öÀΰæ¿ì ¼ö ¹Ð¸®¼¼ÄÁµåµ¿¾È borrowObject()¸¦ ºí·°½ÃÅ°°í ±×ÈÄ¿¡
NoSuchElementExceptionÀ» ´øÁö°Ô µÉ°ÍÀÌ´Ù. maxWait°¡ À½¼ö¶ó¸é borrowObject()¸Þ¼­µå´Â ¿µ¿øÈ÷ ºí·°µÈ´Ù. (Çæ~)

* testOnBorrow°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é, borrowObject()¸Þ¼­µå¸¦ ÅëÇØ ¿ÀºêÁ§Æ®¸¦ ¸®ÅÏÇϱâ Àü¿¡ °¢°¢ÀÇ ¿ÀºêÁ§Æ®ÀÇ À¯È¿¼ºÀ» È®ÀÎ ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù.
(ÆÑÅ丮ÀÇ PoolableObjectFactory.validateObject(T) ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù. )
À¯È¿¼º üũ¿¡ ½ÇÆÐÇϸé Ç®¿¡¼­ ±× ¿ÀºêÁ§Æ®¸¦ ¶³±Å³»°í ´Ù¸¥ ¿ÀºêÁ§Æ®¸¦ ºô·Á¿À°Ô µÉ°ÍÀÌ´Ù. ±âº»¼³Á¤Àº falseÀÌ´Ù.

* testOnReturnÀÌ ¼³Á¤µÇ¾î ÀÖÀ¸¸é, returnObject(T)¸¦ ÅëÇØ Ç®¿¡ ¿ÀºêÁ§Æ®¸¦ ¹ÝȯÇÏ·Á°í ÇÒ¶§
±× ¿ÀºêÁ§Æ®ÀÇ À¯È¿¼ºÀ» È®ÀÎ ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù. (ÆÑÅ丮ÀÇ PoolableObjectFactory.validateObject(T) ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù.)
À¯È¿¼º üũ¿¡ ½ÇÆÐÇϸé Ç®¾î¼¼ ¶³±Å³½´Ù. ±âº» ¼³Á¤Àº falseÀÌ´Ù.


¿É¼ÇÀ¸·Î, ÇÑ°¡Áö ¼³Á¤ÀÌ ´õÀÖ´Ù. Ç®¿¡¼­ ´ë±â»óÅ·ΠÁÖÀú ¾É¾Æ¹ö¸° ¿ÀºêÁ§Æ®µéÀ» ÂѾƳ¾ ¼ö ÀÖ´ÂÁö Á¶»çÇϱâ À§ÇØ ±×¸®°í ´ë±â ¿ÀºêÁ§Æ® ¼ö¸¦ ÃÖ¼Ò°ªÀÌ µÇµµ·Ï º¸ÀåÇϱâÀ§ÇÑ °ÍÀÌ´Ù. ÀÌ°ÍÀº ÇÑ°³ÀÇ 'idle object eviction(´ë±â ¿ÀºÎÁ§Æ® ?i¾Æ³»±â)' ½º·¹µå¿¡
ÀÇÇØ ¼öÇàµÇ¸ç, ºñµ¿±âÀûÀ¸·Î ½ÇÇàµÈ´Ù. ÀÌ ¿É¼ÇÀ» ¼³Á¤ÇÒ °æ¿ì´Â ÁÖÀÇÇؾßÇÑ´Ù. Eviction(¿ÀºêÁ§Æ® ÂѾƳ»±â)Àº Ç®·Î ºÎÅÍ ¿ÀºêÁ§Æ®¸¦ ¾òÀ¸·Á°íÇϴ Ŭ¶óÀ̾ðÆ® ½º·¹µå¿Í ´ÙÅø°ÍÀÌ´Ù. ±×·¯¹Ç·Î EvictionÀÌ ¸Å¿ì ºó¹øÇÏ°Ô ÀϾ´Ù¸é ¼º´É»óÀÇ ¹®Á¦¸¦ °¡Á®¿À°Ô µÉ°ÍÀÌ´Ù. ´ë±â ¿ÀºêÁ§Æ®¸¦ ÂѾƳ»´Â ½º·¹µå´Â ¾Æ·¡ÀÇ ¾îÆ®¸® ºäÆ®µé·Î ¼³Á¤ÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù. (ÇÒ°ÍÀÌ´Ù´Â ¸ÓÀÓ)

* timeBetweenEvictionRunsMillis : ´ë±â ¿ÀºêÁ§Æ®¸¦ ÂѾƳ»´Â ½º·¹µå°¡ "½ÇÇà" µÇ±âÀü¿¡ ¾ó¸¶¸¸Å­ Àáµé¾î ÀÖ¾î¾ß µÇ´ÂÁö¸¦ ³ªÅ¸³½´Ù. À½¼ö·Î µÇ¾îÀÖÀ¸¸é, ´ë±â ¿ÀºêÁ§Æ® ÂѾƳ»´Â ½º·¹µå´Â ¿Ã¶ó¿ÀÁö ¾Ê´Â´Ù. µðÆúÆ® ¼³Á¤Àº -1 ÀÌ´Ù. (Áï ±âº» ¼³Á¤Àº »ç¿ë¾ÈÇÔÀÌ´Ù.)

* minEvictableIdleTimeMills : ¿ÀºêÁ§Æ®°¡ Ç®¿¡¼­ ´ë±â»óÅ·ΠÁÖÀú¾É±â Àü¿¡ idleTime¿¡ ÀÇ°ÅÇØ ÂÑ¾Æ ³¾¼ö ÀÖ´Â ÃÖ¼Ò ½Ã°£·®À» ¸í½ÃÇÑ°ÍÀÌ´Ù. (½Ã°£Á¦ ÇǾ¾¹æ, ¸¸È­¹æÀ» »ý°¢ÇÏ¸é µÇ´Â°Ç°¡.) À½¼ö·Î ¼³Á¤µÇ¾î ÀÖÀ¸¸é, idle time¸¸À¸·Î´Â ¾î¶² ¿ÀºêÁ§Æ®·Î ÂѾƳ»Áö ¾Ê´Â´Ù. ÀÌ ¼³Á¤Àº timeBetweenEvictionRunsMillis > 0 ÀÌ ¾Æ´Ï¸é ÀüÇô È¿°ú°¡ ¾ø´Ù. ±âº»°ªÀº 30ºÐÀÌ´Ù.

* testWhileIdle : ´ë±â ¿ÀºêÁ§Æ®ÀÌµç ¾Æ´Ïµç ÆÑÅ丮ÀÇ PoolableObjectFactory.validateObject(T)¿¡ ÀÇÇØ
À¯È¿¼ºÀ» üũÇϰԵȴÙ. À¯È¿¼ºÃ¼Å©¿¡ ½ÇÆÐÇÑ ¿ÀºêÁ§Æ®´Â Ç®¿¡¼­ ¶³±ÅÁø´Ù. ÀÌ ¼³Á¤Àº timeBetweenEvictionRunsMillis > 0 ÀÌ ¾Æ´Ï¸é ÀüÇô È¿°ú°¡ ¾ø´Ù.µðÆúÆ® ¼³Á¤Àº falseÀÌ´Ù.

* softMinEvictableIdleTimeMills : ¿ÀºêÁ§Æ®°¡ Ç®¿¡¼­ ´ë±â»óÅ·ΠÁÖÀú¾É±â Àü¿¡ ´ë±â¿ÀºêÁ§Æ®¸¦ ÂѾƳ»´Â ½º·¹µå¿¡ ÀÇÇØ ÂѰܳª°Ô µÇ´Â Ãּҽ𣷮À» ¸î½ÃÇÑ´Ù. Ãß°¡ÀûÀÎ Á¶°ÇÀ¸·Î "minIdle"¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº´Â Ç®¿¡ ³²¾Æ ÀÖ¾î¾ß µÈ´Ù. À½¼ö·Î ¼³Á¤µÇ¾î ÀÖÀ¸¸é ¾î¶°ÇÑ ¿ÀºêÁ§Æ®°¡ ´ë±â»óÅ¿¡ ºüÁö´õ¶óµµ ÂѰܳªÁö ¾Ê´Â´Ù. timeBetweenEvictionRunsMillis > 0 ÀÌ ¾Æ´Ï¸é ÀÌ ¼³Á¤Àº ¹«È¿´Ù. ±×¸®°í ÀÌ ¼³Á¤Àº minEvictableIdleTimeMills°¡ À¯È¿ÇÑ°æ¿ì¿¡´Â ¹«½ÃµÈ´Ù. µðÆúÆ® ¼³Á¤Àº -1ÀÌ´Ù. (¹«È¿)

* numTestsPerEvictionRun : ´ë±â ¿ÀºêÁ§Æ®¸¦ ÂѾƳ»³à¼®(½º·¹µå)ÀÇ °¹¼ö. timeBetweenEvictionRunsMillis > 0 ÀÌ ¾Æ´Ï¸é ÀÌ ¼³Á¤Àº ¹«È¿´Ù. ±âº»°ªÀº 3ÀÌ´Ù.

´ë±â ¿ÀºêÁ§Æ®¸¦ Á¸ÁßÇØÁÖ·Á¸é, Ç®Àº LIFOÅ¥·Îµµ ¼³Á¤ÀÌ °¡´ÉÇÏ´Ù. Ç×»ó °¡Àå ÃÖ±Ù¿¡ »ç¿ëµÈ °´Ã¼°¡ Ç®¿¡¼­ ºÎÅÍ ¸®ÅϵȴÙ. ¶Ç´Â FIFO Å¥´Â Ç®ÀÇ °¡Àå ¿À·¡µÈ ¿ÀºêÁ§Æ® ºÎÅÍ ºô·Á¿Â´Ù.


* lifo : ´ë±â ¿ÀºêÁ§Æ®ÀÌµç ¾Æ´Ïµç Ç®Àº last-in-first-outÀ¸·Î °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. µðÆúÆ®´Â true

GenericObjectPollÀº PoolableObjectFactory°¡ ¾ø´Ù¸é ¾µ¸ð¾ø´Ù. nullÀÌ ¾Æ´Ñ ÆÑÅ丮´Â Ç®ÀÌ »ý¼ºµÇ±â Àü¿¡ »ý¼ºÀÚÀÇ ÀÎÀÚ È¤Àº setFactory(org.apache.commons.poll.PoolableObjectFactory)·Î Á¦°øµÇ¾î Á®¾ßÇÑ´Ù.


ÀúÀÛÀÚ Ç¥½Ã ºñ¿µ¸® º¯°æ ±ÝÁö
½Å°í
Å©¸®¿¡ÀÌƼºê Ä¿¸ÕÁî ¶óÀ̼±½º
Creative Commons License