sql_executeUpdate.zip
지금까지 database connection pool에 대해서 설명을 하였습니다.
WCDBConnection.java 는 database Connection object를 저장하는 class입니다.
WCDBConnectionPool.java 는 하나의 database에서 여러개의 connection을 사용할 수 있도록 connection 들을 관리하는 pool입니다.
WCDBConnectionManager.java 는 database connection pool 여러개를 관리하는 class입니다.
앞으로 몇번에 걸처 SQL을 실행하는 java class에 대해서 소개를 하겠습니다.
SQL을 실행하기 위해서는 Database Connection을 얻어와 다음과 같은 작업을 해야 합니다.
1. database connection을 생성
2. executeQuery 혹은 executeUpdate를 실행하고
3. 결과를 얻어와서 저장하고
4. database connection을 free
이와 같이 SQL 실행을 처리하는 java class인 WCStmt을 설명드리겠습니다.
WCStmt는 WDL(Web Development Library) Control Statement의 약자입니다.
update table set name='hello' where id=3
이와 같은 SQL을 실행한다면 아래와 같이 사용가능합니다.
WCDBConnectionManager oMngr = WCDBConnectionManager.getInstance();
String sSql = "update table set name='hello' where id=3";
String sDsn = "WDLDatabasePool";
WCDBConnection oConn = oMngr.getConnection(sDsn);
oConn.setSql(sSql);
Statement oStmt = oConn.getConnection().createStatement();
nRet = oStmt.executeUpdate(sSql);
oStmt.close();
oMngr.freeConnection(sDsn, oConn);
그러나 위의 프로그램은 안전한 프로그갬은 아닙니다.
Exception처리가 안되어 있고, 오류 발생에 대한 처리 로직이 없기 때문입니다.
그래서 아래와 같이 exception handler와 기타 오류 처리 로직을 가미한 code를 만들었습니다.
public synchronized int executeUpdate(String sSql, WCProperties rParam,String sDsn)
{
WCDBConnection oConn = m_connMgr.getConnection(sDsn);
if (oConn == null)
return -1;
int nRet = this.executeUpdateByConn(oConn,sSql,rParam,sDsn);
m_connMgr.freeConnection(sDsn,oConn);
return nRet;
}
public synchronized int executeUpdateByConn(WCDBConnection oConn,String sSql, WCProperties rParam,String sDsn)
{
m_sSql = sSql;
m_sDsn = sDsn;
int nRet = 0;
if (sSql == null)
return -1;
this.log(sDsn,sSql);
if (rParam != null)
{
sSql = makeQuery(sSql,rParam,sDsn);
if (sSql == null)
return -1;
}
if (m_sDsn == null)
return -1;
oConn.setSql(sSql);
Statement oStmt = null;
try
{
oStmt = oConn.getConnection().createStatement();
nRet = this.executeUpdate(oStmt,sSql);
oStmt.close();
}
catch(SQLException e)
{
try
{
oStmt.close();
}
catch(SQLException sql)
{
}
this.log(m_sDsn,sSql+"\n"+e.toString());
m_nErrorCode = getErrorCode();
m_sSQLState = getSQLState();
setLastError(e.toString());
return -1;
}
return nRet;
}
public int executeUpdate(Statement oStmt,String sSql)
{
try
{
String sDatabaseCharset = getDatabaseCharset();
String sSrcCharset = getSystemCharset();
if (!WCString.isEmpty(sSrcCharset) && !WCString.isEmpty(sDatabaseCharset)
&& WCString.Compare(sSrcCharset,sDatabaseCharset) != 0)
{
sSql = WCSystem.convertCharset(sSql,sDatabaseCharset,sSrcCharset);
}
int nRet = oStmt.executeUpdate(sSql);
return nRet;
}
catch (Exception ex)
{
setLastError(ex.toString());
this.log(m_sDsn,m_sSql+"\n"+ex.toString());
}
return -1;
}
이와 같이 SQL을 실행할때 처리하는 기능을 class로 만든것이 WCStmt 입니다.
다음번 글에서는 select를 처리하는 WCStmt의 method에 대해서 설명하겠습니다.
위의 executeUpdate method는 insert,update,delete와 같이 select로 결과를 얻어오지 않는
SQL을 실행합니다. 위의 프로그램은 WCStmt.java에서 일부분을 추출하여 설명을 하였습니다.
모든 소스는 첨부파일에 첨부하였습니다.
또한 소스가 완벽히 실행하기 위해서는 WCProperties,WCVector,WCLog,WCSystem,WCPage 등의 source코드가 필요합니다.
이러한 소스코드도 모두 차차 글을 올리며 설명하겠습니다.
미리 보시려면 Web Development Library(www.webdevlib.net)에서 download 받아 사용하실 수 있습니다.
첨부된 소스코드는 개발 project에서 실제사용되고 있는 source입니다.
첨부파일 : sql_executeUpdate.zip
WCDBConnection.java
WCDBConnectionManager.java
WCDBConnectionPool.java
WCStmt.java
sql_executeUpdate.jsp
출처 : 고급 웹 UI 개발 라이브러리 Web Development Library 소스공개 : http://www.webdevlib.net