본문 바로가기

DB/Apache Derby

Step 3: Embedded Derby

Step 3: Embedded Derby

Introduction

애플리케이션이 Embedded Derby JDBC드라이버를 이용하여 더비 데이터베이스에 접근할때 더비 엔진은 서로다른 프로세스에서 실행되지는 않는다. 그리고 start up과 shut down을 위한 별도의 프로세스가 존재하지 않는다. 대신 더비 데이터베이스 엔진은 애플리케이션과 동일한 자바 버추어머신에서 수행된다. 그래서 더비는 애플리케이션의 한 부분이 되어 애플리케이션이 이용할 수 있게 한다. 그림 1은 이러한 embedded 아키텍처를 보여준다.

Figure 1: Derby Embedded Architecture

Figure 1: Embedded Architecture

이 섹션에서는 어떻게 컴파일 되고 실행되는지에 대해서 보여주고 있다. 정보는 단순하게 전달되다는 것을 알 수 있다. 예제는  Derby Developer's Guide를 보기 바란다.

Set the environment

환경설정은 Configure Embedded Derby를 참조하라.

Sample Application

Copy sample application

더비 소프트웨어는 SimpleApp.java라는 샘플 애플리케이션을 포함한다. 더비 10.2와 그 상위버젼에서는 DERBY_INSTALL/demo/programs/simple 디렉토리에서 확인할 수 있다.

이것을 현재 디렉토리에 복사해서 확인하길 바란다.


기본적으로 이 애플리케이션은 embedded모드로 실행되며 다음과 같은것을 수행한다.

  • Starts up the Derby engine
  • Creates and connects to a database
  • Creates a table
  • Inserts data
  • Updates data
  • Selects data
  • Drops a table
  • Disconnects
  • Shuts down Derby

A quick look at the code

SimpleApp.java 애플리케이션은 대부분의 시간을 테이블 생성에 소모하고, 또한 테이블에 데이터를 삽입하는데 소모된다. 많은 JDBC와 같다. 이 섹션의 JDBC 콜의 하일라이트는 Embedded Derby 애플리케이션을 만드는 것에 있다. Derby Network Server 섹션은 어떻게 client/server 애플리케이션에서 동일한 JDBC콜을 하는지 보여준다.

Load the Embedded JDBC Driver

SimpleApp 애플리케이션은 Derby Embedded JDBC드라이버를 로드하고 더비를 실행한다.

public String driver = "org.apache.derby.jdbc.EmbeddedDriver"; ... Class.forName(driver).newInstance();

Get an Embedded Connection

SimpleApp 애플리케이션은 생성과 derbyDB 데이터베이스에 접속한다.

public String protocol = "jdbc:derby:"; ... conn = DriverManager.getConnection(protocol + "derbyDB;create=true", props);


embedded 커넥션 URL은 다음과 같이 풀로 보여준다.

jdbc:derby:derbyDB;create=true

Shut Derby down

shutdown은 체크포인트를 설정하고 자원을 해제하는 역할을 수행한다. embedded애플리케이션이 더비를 셧다운 하지 않은경우 체크포인트는 수행하지 않을 것이다. 다른 어떠한 잘못된 일은 일어나지 않는다. 단지 다음 접속때 복구코드를 실행하기 위해서 조금 느려질 뿐이다.


더비 셧다운을 다음과 같은 코드로 수행할 수 있다.

DriverManager.getConnection("jdbc:derby:MyDbTest;shutdown=true");


데이터베이스와 더비 엔진까지 셧다운 하고 싶을경우 다음과 같은 코드를 이용하면 된다.

DriverManager.getConnection("jdbc:derby:;shutdown=true");


SimpleApp.java코드는 모든 데이터베이스를 셧다운 시키고 엔진도 함께 다운시킨다. 또한 SQL exception 테스트를 해볼 수 있다. clean shutdown은 항상 SQL exception XJ015를 발생 시키지만 이것은 무시할 수 있다.

Compile sample application

샘플 코드를 컴파일 하자.

javac SimpleApp.java

Run sample application

샘플 코드를 실행하자.

java SimpleApp


그럼 다음과 같은 내용을 볼 수 있다.

SimpleApp는 embedded모드로 실행이 된다. 적합한 드라이버가 로드 되며, derbyDB에 새로운 데이터베이스를 생성하고 테이블을 생성된다. 그리고 거기에는 1956 Webster이 입력되고 1910의 유니언 업데이트를 1956 Webster을 180 Grand로 180Grand는 300 Lakeshore로 업데이트 하고 테이블을 삭제하고 result set과 스테이트먼트를 클로즈 하기 위해서 트랜잭션을 커밋한다. 또한 데이터베이스를 셧다운 시키고 SimpleApp를 종료하는 과정으로 이루어 진다.

아래와 같이 에러를 하나라도 보게 되면 그것은 클래스 패스가 정확하지 않음을 나타낸다.

java SimpleApp SimpleApp starting in embedded mode. exception thrown: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver at java.net.URLClassLoader$1.run(URLClassLoader.java:199) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:141) at SimpleApp.go(SimpleApp.java:77) at SimpleApp.main(SimpleApp.java:61) SimpleApp finished

클래스 패스 문제를 해결하기 위해서는 "Configure Embedded Derby" and "Verify Derby"항목을 확인하라.

Embedded Derby supports multiple users in one JVM

Derby는 주어진 데이터베이스에 멀티플 연결을 혀용한다. embeded application의 예제에서 Tomcat혹은 Geronimo애플리케이션 서버는 현재 사용자 관리에 대한 내용을 보여준다. 어떤수의 고객이라도 웹 애플리케이션을 실행할 수 있고, 웹 애플리케이션을 통해서 데이터베이스에 접속할 수 있다.

하나의 JVM에서 데이터베이스 부팅을 한다면 복합 애플리케이션이 서로다른 JVM에서 수행된다면 동일한 데이터베이스에 접근할 수 없다. 이것을 더욱더 이해할 수 있기 위해서는 다음과 같이 수행해보면 된다.

SimpleApp 애플리케이션을 생성한후 derbyDB를 호출한다. 하나의 윈도우에서 ij를 이용하여 데이터베이스에 다음과 같이 접근한다.

java org.apache.derby.tools.ij
ij version 10.4
ij> connect 'jdbc:derby:derbyDB'; ij>

이제 다른 SimpleApp 애플리케이션을 실행해 보자.

java SimpleApp SimpleApp starting in embedded mode Loaded the appropriate driver
----- SQLException -----
SQL State: XJ040
Error Code: 40000
Message: Failed to start database 'derbyDB', see the next exception for details.
----- SQLException -----
SQL State: XSDB6
Error Code: 45000
Message: Another instance of Derby may have already booted the database C:\Apache\db-derby-10.4.1.3-bin\tutorial\derbyDB.
SimpleApp finished

다른 애플리케이션인 SimpleApp가 연결을 설정하기 위해서 시도할경우 실패하게 된다. ij 는 이미 derbyDB 데이터베이스에 연결된 상태이다.

문제는 ij와 SimpleApp는 서로다른 JVM에서 수행되고 있다는 것이다. 그리고 주어진 데이터베이스는 오직 하나의 JVM에서만 동작한다는 것이다. 첫번째 애플리케이션이 "wins"연결되고, 이 케이스에서는 ij가 연결 되었다. rmflrh 다른 애플리케이션의 연결을 막는다.

사실 서로다른 JVM에서 복합 커넥션을 구성할 수 있다. 그것에 관련된 내용을 보고자 한다면 다음 섹션을 확인해 보라. "Step 4: Derby Network Server"

'DB > Apache Derby' 카테고리의 다른 글

Step 4: Derby Network Server  (0) 2008.06.10
Step 2: ij Basics  (0) 2008.06.10
Step 1: Install Software  (0) 2008.06.10