자바로 만든 embedded db 비교

embedded db는 oracle, mysql 처럼 네트워크 기반으로 데이터 서비스를 제공하지 않고 DB를 사용하는 프로그램이 수행되는 장비의 로컬 파일시스템 또는 메모리를 이용하는 DB를 말한다.
자바로 만든 embedded db 오픈소스 중  derby, berkeley db, hsqldb를 가지고 몇가지 테스트를 해 보았다. derby, hsqldb는 네트워크 기반, 임베디드 기반 모두 지원하지만 여기서는 임베디드 기반만 테스트 하였다. berkeley db(이후 bdb)는 db 라기 보다는 hash 형태만 제공하는 아주 간단한 db이다.
1 row = 1000byte, 100,000 rows 데이터를 저장하는 테스트를 수행하였다.

100,000  insert 한 다음 commit(bdb의 경우 sync) 하는 경우

bdb(14초) << hsqldb(42초) < derby(53초)

bdb가 다른 db에 비해 상상 할 수 없을 정도의 속도로 저장되었다.
hsqldb의 경우 옵션에 따라 성능 차이가 많이 나타난다. hsqldb는 server 타입, file 타입, memory 타입 세가지 형태로 사용할 수 있다. 테이블을 생성할 때 create memory table ...형태로 만들면 memory 기반 테이블이 되고 create cached table로 만들면 file 기반 테이블이 된다.
file 기반 테이블은 일정 크기 동안은 메모리에 저장시키고(물론 change log 정보는 파일에 기록) 메모리가 일정 수준 이상 도달하면 디스크로 저장하는 하이브리드 방식을 채택하고 있다. 여기서 문제점은 디스크로 저장할 때 기존 파일에 추가하는 것이 아니라 기존 파일 + 메모리 내용이 되는 새로운 파일을 만든다는 것이다. 데이터 크기가 큰 경우 데이터 파일을 생성하는데 너무 많은 시간이 소요되고 이 시간 동안 insert 작업을 할 수 없게 된다.


1건씩 commit 하는 경우

hsqldb(42초) < derby(158초) << bdb(답이 없음, 수십분 이상)


위 성능으로 보면 hsqldb가 commit, rollback을 지원하지 않는 것 처럼 보이지만 실제 테스트 해보면 rollback도 잘 지원한다. 건당 commit 하는 경우와 전체 commit 하는 경우가 동일한 속도를 보장하고 있는데 다른 side effect는 없는지 확인해봐야 겠다.
어쨋든 여러가지를 고려해보면 안정적인 성능을 발휘하는 derby가 그나마 가장 좋기는 한데 원하는 수준의 속도가 나오지 않는다.
 


 

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


mysql data file 변경

1)  mysql shutdown

 

  ● mysqladmin -u root -p shutdown


2) 원래데이터(/usr/local/mysql/data) 를 원하는 곳으로 복사함


  ● 화일 소유권 변경

  ● 화일 그룹 변경


3) /usr/local/mysql/bin 안의 mysql_safe 수정


  ● DATADIR = /usr/local/mysql/data

    => DATADIR = [변경한 곳]   - 절대경로


4) mysqld_safe&         : mysql 재가동


5) ps -ef | grep mysql               : mysql 가동 여부 및 경로 확인

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


BerkeleyDB 설치하기

1. 압축해제
2. cd db-4.4.20/build_unix/
: 이부분에서 삽질... 반드시 build_unix에서 해줘야 함... 그렇지 않으면 다음과 같은 오류 발생

configure: error: Berkeley DB should not be built in the top-level or dist directories.


3 ../dist/configure ?prefix=/usr/local/BerkeleyDB
4. make
5. make install
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Derby 소개

요즘 Apache 프로젝트 중 DBMS 개발 프로젝트인 Derby에 대해 살펴보고 있다. Derby는 IBM의 Cloudscape DB의 오픈소스 버전이다. 실제로는 Derby와 Cloudscape는 같은 소스를 사용하고 있으며 매뉴얼도 동일하다. 차이점은 매뉴얼에 Derby라는 단어가 Cloudscape로 바뀌었을 뿐이다.

오라클과 같은 우리가 흔히 사용하는 DBMS의 경우 DB 서버를 구동시키고, 클라이언트는 SQL*Net과 같은 DBMS에 제공하는 네트워크(TCP/IP)기반의 도구를 이용하여 DB 서버에 접근하는 방법이다. Derby의 경우 이런 방식도 지원하지만 Embeded 모드도 지원한다.

- Network Server 또는 Client/Server 방식 : Oracle과 같이 네트워크 기반의 DBMS 서버 방식.

- Embeded 방식 : 데이터베이스를 사용하는 Application에 포함되어 해당 Application과 동일한 JVM에서 수행되는 방식이다. 이런 방식은 웹 애플리케이션 보다는 범용 애플리케이션(예를 들면 서브버전과 같은 형상관리 도구 또는 PC에 설치되는 비디오 대여점 관리 애플리케이션 등)에서 데이터 관리가 필요한 경우 사용될 수 있다. Embeded 방식의 경우 동시에 여러 Connection을 설정할 수 없다.

이 두가지 방식에 따라 클라이언트가 사용하는 JDBC 드라이버도 다르게 설정해야 한다. Network Server 방식의 경우 "org.apache.derby.jdbc.ClientDriver"를 Embeded 방식의 경우 "org.apache.derby.jdbc.EmbeddedDriver"를 사용한다.

Network Server 방식도 엄밀히 말하면 Embeded 방식이라고 할 수 있는데 이것은 org.apache.derby.drda.NetworkServerControl 이라는 Java Application을 만들어 여기에서 네트워크로부터 전송된 클라이언트의 요청을 처리하도록 구현되어 있다.
결과적으로 Derby는 기본적으로 DBMS에서 핵심이라고 할 수 있는 데이터 저장을 위한 파일 구조와 SQL 처리를 core로 구성한 후 이것을 필요에 따라서 쉽게 변경하여 사용할 수 있도록 구현되어 있는 것이다.
그렇다고 Network Server 방식이 기능적으로 떨어지지는 않는다. 4가지 모드의 Transaction Isolation Level을 지원하여 commit; rollback; 처리를 할 수 있다. 다만 조금 부족한 것은 오라클과 같은 상용 DBMS에서 제공하는 GUI 환경의 뛰어난 관리도구와 DBMS의 메타데이터를 관리하는 능력에서는 현저하게 떨어진다고 할 수 있다.

어제부터 설치와 관련된 주요 이슈는 다음과 같다.

1.환경 설정
derby의 경우 jdk1.4와 1.3으로 개발되었다. 소스내에 보면 enum을 변수로 사용하고 있는데 jdk1.5에서는 enum은 예약어라 변수명으로 사용할 수 없다. 따라서 jdk를 1.4로 사용할 것을 추천한다.


set path=C:j2sdk1.4.2_07?in;C:db-derby-10.1.3.1-binframeworksNetworkServer?in;%PATH%

set CLASSPATH=C:db-derby-10.1.3.1-binlibderbyclient.jar;
C:db-derby-10.1.3.1-binlibderby.jar;
C:db-derby-10.1.3.1-binlibderbynet.jar;
C:db-derby-10.1.3.1-binlibderbytools.jar;
C:db-derby-10.1.3.1-bin;%CLASSPATH%

set JAVA_HOME=C:j2sdk1.4.2_07


2. Network Server 시작
- java org.apache.derby.drda.NetworkServerControl start
- Network Server와 관련된 모든 내용은 NetworkServerControl 클래스를 이용한다.



위 화면은 아무런 옵션을 주지 않고 실행한 화면이다. 사용 가능한 옵션에 대한 정보를 보여준다. 서버를 종료하기 위해서는 shutdown 옵션을 사용한다.
-p 옵션은 DBMS 서버의 리스너 port를 지정하는데 사용한다. 기본 port는 1527 이다.

3. ij를 이용하여 서버 접속 테스트
Derby는 자체에 몇가지 도구를 제공하고 있는데 ij는 오라클의 SQL*PLUS에 해당하는 도구이다. 이 도구를 이용하여 DB에 접속하고 테이블 생성, SQL문 실행 등의 작업을 할 수 있다.
실행은 1번에서의 환경설정을 동일하게 한 후 ij.bat라고 치면 된다(Linux의 경우 ij.ksh)

DB에 연결하기 위해서는 먼저 DB를 생성해야 하는데 create database와 같은 명령은 존재하지 않고 connect할 때 없으면 만들도록 하는 옵션을 이용한다.

connect 'jdbc:derby://localhost:1527/testdb;create=true';

위의 connection 명령은 "testdb"라는 이름을 가진 database로 접속을 하는데 없는 경우 만들어라는 명령이다. testdb의 실제 저장 파일은 Derby 설치 디렉토리 하단에 생성된다. 별도의 디렉토리를 설정하고 싶은 경우 connection url을 다음과 같이 하면 된다.

jdbc:derby://localhost:1527/c:/my-db-dir/testdb;create=true



오라클의 desc와 같이 테이블 정보를 보는 기능을 제공하지 않는다. 이것은 Eclipse Database Plugin을 이용하거나 별도의 도구를 이용하는 방법밖에 없다.

ij에서 사용 가능한 명령어는 help; 를 치면 나타난다.

4. 사용자 설정
3번까지의 경우에는 연결할 때 별도의 사용자 인증 절차없이 로그인 하였다. DBMS 서버의 경우 데이터를 관리하고 있기 때문에 보안 관련하여 아주 민감한 서버라 할 수 있다. 따라서 반드시 DBMS에 접속하기 위해서는 사용자 인증을 받도록 해야 한다.
아직 이 부분에 대해서 좀 더 확인해야 하지만 현재까지 파악된 내용은 사용자 설정과 관련하여 몇가지 옵션을 제공하고 있으며 Property, OS, LDAP 사용자 등을 이용하는 방법이 있다.
여기서는 Property를 이용하여 설정하는 방법에 대해 설명한다.

먼저 derby.properties 파일을 Derby home에 만든다. 앞의 환경설정에서 Derby home 디렉토리 자체를 CLASSPATH 상에 두었는데 이 properties 파일을 인식하게 하기 위해서 였다.
derby.properties에서는 port와 같은 기본적인 설정뿐만 아니라 max thread 수와 같은 성능 관련된 내용도 설정할 수 있다.

derby.connection.requireAuthentication=true
derby.authentication.provider=BUILTIN
derby.user.dbuser=123456

위와 같이 설정하여 사용자 인증을 사용하도록 하고 인증 방법은 "BUILTIN"을 이용하고 사용자 ID는 "dbuser", 패스워드는 "123456"을 사용하도록 지정한 후 Derby Server를 다시 실행한다.

사용자 설정이 된 후 DB에 접속 하기 위해서는 다음과 같이 id, pwd를 준다.

jdbc:derby://localhost:1527/testdb;create=true;user=dbuser;password=123456

5. 원격 client에서 접속 가능하도록 설정
다른 장비 또는 PC에서 DB 서버에 접속하도록 하기 위해서는 host 설정을 반드시 해주어야 한다. host 설정은 DB Server 시작시 -h 옵션을 이용할 수고 있고, properties 파일에서 다음을 추가할 수 있다.

derby.drda.host=hostName

hostname이 없는 경우 ip를 주면 된다. 이렇게 구성한 다음에 서버에 접속할 때에는 반드시 여기서 설정된 hostname을 이용하여 접속해야 한다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


자바 프로그램내에서 Derby 사용하기

최근 개발하고 있는 프로그램 중은 단독으로 운영되는 자바 애플리케이션인데 프로그램내에서 많은 정보를 관리해야 하기 때문에 간단한 수준의 DBMS가 필요했는데 apache의 derby를 잠깐 테스트 해보았다. 3시간 동안 삽질한 결과이다. *^^*

오라클과 같은 일반 DBMS는 DBMS가 서버로 수행되고 클라이언트가 네트워크 접속을 통해 접속하여 사용하는 방식으로 수행된다. 하지만 derby의 경우 이런한 환경도 기본적으로 제공하지만(Network Server) 동일한 애플리케이션에서 동일한 JVM내에서 네트워크 접속을 사용하지 않고도 사용할 수 있는 기능을 제공한다.

derby를 다운로드 받아 압축을 해제한 후 다음과 같은 샘플 프로그램을 만든다.
public class DerbyTest
{
public static void main(String[] args)
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
conn = DriverManager.getConnection("jdbc:derby:derbyDB;create=true");

stmt = conn.createStatement();

stmt.execute("CREATE TABLE emp (id integer primary key not null, name varchar(32))");
stmt.execute("INSERT INTO emp VALUES (1, '김형준')");
rs = stmt.executeQuery("SELECT * FROM emp");
while(rs.next())
{
System.out.println("성명:" + rs.getString(2));
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try { rs.close(); } catch(Exception err) {}
try { stmt.close(); } catch(Exception err) {}
try { conn.close(); } catch(Exception err) {}

//DB shutdown
boolean shutDownError = false;
try
{
DriverManager.getConnection("jdbc:derby:;shutdown=true");
}
catch (SQLException se)
{
shutDownError = true;
}

if (!shutDownError) System.out.println("DB 종료 오류");
else System.out.println("DB 정상 종료");

}
}
}

수행시키기 위해서는 다음 세개의 파일을 클래스 패스로 잡는다.
derby.jar
derbyclient.jar
derbynet.jar

getConnection("jdbc:derby:derbyDB;create=true") 에서 derbyDB 라는 새로운 Database를 생성하라는 의미이다. 물론 기존에 존재하면 만들지 않는다. 이렇게 만들어진 database는 파일로 존재하는데 실행시키는 애플리케이션의 HOME에 만들어진다 필자의 경우 eclipse 의 workspace 상에서 수행했기 때문에 다음과 같은 폴더가 만들어 졌다.

c:eclipseworkspacederbytestderbyDB


그리고 DB 종료시 위와 같이 구성한 이유는 DriverManager.getConnection("jdbc:derby:;shutdown=true"); 이와 같은 구문으로 DB 종료시 정상적으로 종료되어도 SQLException이 발생한다. 종료되었다는 것 자체를 예외로 보기 때문인것 같다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준