H2Databaseを使用してみた

なんとなく軽量データベースを使用したくなったので、いじってみた。
使用するまでが一瞬、そして操作も簡単、組み込みも簡単と非常に手軽でした。

H2Databaseとは

H2 Databaseとは、Javaプラットフォーム上で動く、ACIDリレーショナルデータベース。オープンソース。速度が速いことを特徴としている。

http://ja.wikipedia.org/wiki/H2_Database

軽量なデータベースという認識でよいのだろうか。
似たような用途だと以下のDatabaseがあるらしい。

Groovyから使用

Grapeを使用すれば簡単。
newInstanceで「mem」を指定することでメモリ上に作成しています。
ここにPATHを指定することで保存されます。

@Grapes([
    @Grab(group = 'com.h2database', module = 'h2', version = '1.3.173'),
    @GrabConfig(systemClassLoader = true)
])
import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")
sql.execute '''
  create table project(id int, name varchar(10))
'''
sql.dataSet("project").add([id:1,name:"hoge"])
sql.dataSet("project").add([id:2,name:"huga"])

sql.rows("select * from project").each {
  println "id=${it.id}, name=${it.name}"
}

モジュールを取得して使用

モジュール落として、解凍して実行すればOK

  • H2 Database EngineのDownloadからzipで取得
  • 解凍
  • 「bin\h2.bat」か「bin/h2.sh」を実行
  • ログイン画面が表示される

  • 接続ボタン押下
  • SQL実行

ログイン画面の「jdbc URL」内に「~/test」とあるけど、これはこのPATHにファイル作って保存するという事。
こんな風に「test.h2.db」、「test.trace.db」の2つのファイルが作成されます。

C:\Users\yamap>dir /B test*
test.h2.db
test.trace.db

尚、「テスト接続」を実行した段階でも作成されるらしいので注意。

DBを止めたい場合にはログイン画面 → 設定 → シャットダウン

jdbc接続

「bin/h2-1.3.173.jar」をClassPathに設定して、ログイン画面に設定されているように接続すれば接続可能です。

import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:h2:c:/Users/yamap/test", "sa", "", "org.h2.Driver")

sql.rows("select * from project").each {
  println "id=${it.id}, name=${it.name}"
}

ただ、コネクションは1つ?しか張れないようなので、2箇所目から接続しようとすると下記のような例外が発生します。
あくまでも1つのアプリケーションから使用するという前提のようです。

ERROR org.h2.jdbc.JdbcSQLException:
データベースが使用中です: "Locked by another process".

csvファイルとの連携

H2 Databseはcsvファイルとの連携方法が容易です。
読み込む場合は「csvread('入力ファイル名')」、書き込む場合は「call csvwrite('出力ファイル名', 'SQL')」で可能。

読み込み
id,name
100,pen
101,apple
102,tea
select * from csvread('read.csv');
書き込み
call csvwrite('out.csv', 'select * from project');
"ID","NAME"
"1","hoge"
"2","huga"
csvファイルからのデータインポート
insert into project select * from csvread('import.csv');