2011년 8월 1일 월요일

Derby Embedded DataBase


Site
http://db.apache.org/derby/

What is Derby?
  • Derby는 아주 작습니다.(2.6 MB)
  • Java, JDBC, SQL을 기본으로 합니다.
  • Java 기반의 솔루션을 만든다면 Derby을 Embed할 수 있도록 Embedded JDBC 드라이버를 제공합니다.
  • Derby는 Client/Server 형태도 지원합니다.
  • Derby는 설치, 배포, 사용이 쉽습니다.

Embedded Derby
필요한 Jar?
  • derby.jar
  • derbytools.jar

"org.apache.derby.jdbc.EmbeddedDataSource" 를 사용하면 Derby를 Embedded 시킬수 있다. 단 하나의 JVM에서 하나의 Derby 인스턴스만 생성할 수 있다.(Derby에서 사용하는 File에 Lock이 걸려서 2개 이상은 오류가 발생함.)

EmbeddedDataSource ds = new EmbeddedDataSource();
ds.setDatabaseName(dbname);
ds.setUser(user);
ds.setPassword(password);
ds.setCreateDatabase("create");
  • dbName은 paht까지 지정할 수 있음.
  • User/Password는 Embedded 환경에서는 중요하지 않음.

Sample Code

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.derby.jdbc.EmbeddedDataSource;

import com.hs.mobile.push.config.MPSConfiguration;
import com.hs.mobile.push.main.MPSServiceHelper;

public class DatabaseManager {

private static EmbeddedDataSource ds;

private static ThreadLocal<Connection> tranConnection = new ThreadLocal<Connection>();


private static void initDataSource(String dbname, String user,
String password) {
ds = new EmbeddedDataSource();
ds.setDatabaseName(dbname);
ds.setUser(user);
ds.setPassword(password);
ds.setCreateDatabase("create");
}

public static void logSql() throws Exception {
executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY("
+ "'derby.language.logStatementText', 'true')");
}

public static synchronized void beginTransaction() throws Exception {
if (tranConnection.get() != null) {
throw new Exception("This thread is already in a transaction");
}
Connection conn = getConnection();
conn.setAutoCommit(false);
tranConnection.set(conn);
}

public static void commitTransaction() throws Exception {
if (tranConnection.get() == null) {
throw new Exception(
"Can't commit: this thread isn't currently in a "
+ "transaction");
}
tranConnection.get().commit();
tranConnection.set(null);
}

public static void rollbackTransaction() throws Exception {
if (tranConnection.get() == null) {
throw new Exception(
"Can't rollback: this thread isn't currently in a "
+ "transaction");
}
tranConnection.get().rollback();
tranConnection.set(null);
}

public static Connection getConnection() throws Exception {
if (tranConnection.get() != null) {
return tranConnection.get();
} else {
return ds.getConnection();
}
}

public static void releaseConnection(Connection conn) throws Exception {

if (tranConnection.get() == null) {
conn.close();
}
}

public static void initDatabase( boolean dropTables) throws Exception {

MPSConfiguration config = MPSServiceHelper.mpsConfig;

initDataSource(MPSServiceHelper.path+"/WEB-INF/"+config.getDBName(), config.getDBUser(), config.getDBPassword());

if (dropTables) {
dropTables();
}

if (!tableExists(config.getDBUser(), config.getNotiTableName())) {
createTables();
}
}

private static boolean tableExists(String user, String tablename)
throws Exception {
Connection conn = getConnection();
ResultSet rs;
boolean exists;

try {
DatabaseMetaData md = conn.getMetaData();
rs = md.getTables(null, user.toUpperCase(),
tablename.toUpperCase(), null);
exists = rs.next();
} finally {
releaseConnection(conn);
}

return exists;
}

private static void createTables() throws Exception {

StringBuffer sb = new StringBuffer();
sb.append("CREATE TABLE "+MPSServiceHelper.mpsConfig.getNotiTableName()+ "(" );
sb.append(MPSServiceHelper.mpsConfig.getNotiTableColumns());
sb.append(")");
executeUpdate(sb.toString());
}

public static void dropTables() throws Exception {
try {
executeUpdate("DROP TABLE " + MPSServiceHelper.mpsConfig.getNotiTableName());
} catch (SQLException sqle) {
if (!tableDoesntExist(sqle.getSQLState())) {
throw sqle;
}
}
}

private static boolean tableDoesntExist(String sqlState) {
return sqlState.equals("42X05") || sqlState.equals("42Y55");
}

public static void clearTables() throws Exception {
Connection conn = getConnection();
try {
executeUpdate("DELETE FROM " + MPSServiceHelper.mpsConfig.getNotiTableName());
} finally {
releaseConnection(conn);
}
}

public static int executeUpdate(String statement) throws Exception {
Connection conn = getConnection();
try {
PreparedStatement ps = conn.prepareStatement(statement);
return ps.executeUpdate();
} finally {
releaseConnection(conn);
}
}

public static ResultSet executeQueryNoParams(Connection conn,
String statement) throws Exception {

PreparedStatement ps = conn.prepareStatement(statement);
return ps.executeQuery();
}
}

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...