java에서 Mysql을 embedding해서 사용하기
요즘에는 보통 개발환경 구축 시에 DBMS도 로칼에다 같이 설치한다. 요 디비에 접속해서 개발하고, 수정하고, 테스트 하니까 당연히 다른 개발자와 쫑나는 경우는 없다. 그리고 개발이 완료된 후에는 변경된 디비의 스키마도 버전관리시스템으로 관리하고.

그런데 경우에 따라서는 DBMS를 을 미리 설치하지 않고 java 어플리케이션 구동시에 같이 구동하고 싶을 경우도 있다. 보통은 H2나 HSQL과 같은 순수 java로 된 DBMS를 사용하면 embedding은 무척 간단하다. 라이브러리만 임포팅 하고 드라이버 클래스만 잘 설정하고 connection url만 그에 맞게 설정하는 것으로 별도로 구동하지 않고 DBMS를 띄울 수 있다.

그런데 디비의 스키마나 query, procedure가 MySQL에 종속된 경우에는 H2나 HSQL 같은 다른 DBMS를 사용하면 제대로된 동작을 보장할 수 없게 된다. 어쩔 수 없이 MySQL을 사용하여야 하는데, 찾아 보니 mysql-connector-mxj라는게 있다. 홈페이지는 http://dev.mysql.com/doc/connector-mxj/en/index.html. MySQL에서 공식 배포하는 패키지다. 사실 c로 개발된 MySQL을 java에서 임베딩한다는게 말이 안된다. 

mysql-connector-mxj의 임베딩 방식
java로 MySQL을 구현한 것이 아니고, 단지 기존 MySQL을 다양한 OS와 cpu 타입에 맞게 컴파일한 binary 실행파일들을 패키지 내에 가지고 있는 것이다. 그리고  java의 시스템 property 'OS.name'과 'OS.arch'의 값을 가지고 binary 실행파일을 실행하고 있다. 단지 미리 컴파일한 실행파일이 있고, 그것을 java와 별개의 프로세스로 구동해 준다. DBMS를 미리 설치하지만 않았을 뿐이다.

버전 관련
2012/08/27 현재 Mysql의 최신 버전은 5.5.27이고 mxj의 최신 버전 5.1.40(2011/07/07자)에 포함된 mysqld의 버전은 5.5.9이다. 별 문제 없겠다.

라이센스
GPL이다. 테스트라면 몰라도 배포버전에 사용하는 것은 문제가 될 수 있겠다.

문제 있는 공식 버전
그런데 공식 배포한 것을 보면 2가지 문제가 있다. 구동된 mysqld 프로세스를 죽이기 위한 kill.exe 실행파일이 누락된 것이고, 일부 AMD cpu의 windows7에 해당하는 binary 실행파일의 매핑이 누락되어 있다. 요걸 openmrs.org라는 곳에서 패치해서 공개해 놓았다.


설치 방법
maven의 pom.xml에 다음을 추가한다.

<!-- maven 공식 repository에는 fix된 버전이 없다. openmrs.org의 repository를 설정해 줘야 한다. -->
<repositories>
<repository>
<id>openmrs.org</id>
<url>http://mavenrepo.openmrs.org/nexus/content/repositories/thirdparty/</url>
</repository>
</repositories>

<dependencies>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-mxj-fixed</artifactId>
<version>5.0.12</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-mxj-db-files-fixed</artifactId>
<version>5.0.12</version>
</dependency>
</dependencies>

사용 방법
두 가지 사용 방법이 있다. 하나는 connection url에 명시하는 방법이고, 다른 하나는 java code에서 mysld를 구동하는 방법이다.

전자의 경우 "jdbc:mysql:mxj://localhost:3306/mydb"와 같은 url을 사용한다. 사용하는 jdbc 드라이버 클래스는 일반적인 com.mysql.jdbc.Driver이다. 실제 connection이 맺어 질때 알아서 mysql을 구동시킨다.

후자의 경우 MysqldResource라는 클래스를 사용하여 start(), shutdown()를 호출하여 명시적으로 mysql을 구동시킨다.

실제 동작하는 프로젝트를 첨부한다. mxj-test.zip
첨부된 파일에 있는 것은 pom.xml과 2개의 java 어플리케이션이다. 요 java 파일 2개는 다운로드한 mysql-connector-mxj 소스에 포함되어 있었던 것이다. 실행방법은 mvn clean install 하여 필요한 패키지 다운 받고, 각 2개의 java 파일을 java 어플리케이션으로 실행하면 된다.


또 다른 버그
url 타입으로 실행시킬 때 server.initialize-user=true 라는 옵션이 있다. 요 옵션은 connection 요청을 할 때 넘겨진 유저 계정을 자동으로 생성하여주는 것인데, 유감스럽게도 버그가 있다. 그래서 오직 예저 소스의 계정으로만 접속된다.


참고
cpu, OS와 바이너리 실행파일의 매핑 정보는 mysql-connector-mxj-db-files.jar의 platform-map.properties에 있다.


by 어플로잇 | 2012/08/27 15:51 | java tip | 트랙백 | 덧글(0)
트랙백 주소 : http://aploit.egloos.com/tb/5671394
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >