技術情報

H2 Database Engineに関する技術・製品の概要

-- 2011.12.06 GroupSession Version4.0.0 --

はじめに

GroupSessionで使用しているデータベースはH2 Database Engine(以下H2という)です。


H2をGroupSessionに採用した理由として、H2がどの様なデータベースエンジンなのかを技術情報と共にご紹介いたします。

H2 Database Engine の概要

H2は下記の特徴があります。

  • Javaで作成されています。
  • フリー(*1)で利用できます。
  • 高速に動作します。
  • コンパクトなファイルサイズ(1MB程度)
  • 起動モードとして「組み込みモード」、「サーバモード」、「クラスタモード」があります。(GroupSessionは「組み込みモード」で動作しています。)

どの程度高速かというと[H2公式ホームページ]のトップページに処理性能のグラフを表示しているほど、処理パフォーマンスが非常に優れています。

将来性のあるハイパフォーマンスデータベースです。

技術情報

GroupSessionを開発する過程で調査したH2に関する技術情報をご紹介します。

Javaプログラムから組み込みモードで使用する

JavaプログラムからH2 を組み込み(Embedded)モードで使用するため
「jdbc:h2:[file:][<path>]<databaseName>」形式の接続文字列を生成しています。
GroupSessionでは接続文字列と設定ファイル(dataSource.xml、connectOption.properties)を元にデータソースを生成しています。
※詳細はGroupSession Version3のソースを参照ください。

JavaプログラムからH2を組み込みモードで使用する例

//データベースコネクションを取得するサンプルクラス
public static void main(String[] args) throws Exception {
	Class.forName("org.h2.Driver");
	Connection conn = DriverManager.
		getConnection(
		    "jdbc:h2:file:C:\GS2DATA\db\gs2db\gs2db;",
		    "username",
		    "password");
	//
	// プログラムコード
	//
}
    

GroupSessionでのコーディング(DataSource使用)

//データベースコネクションを取得するサンプルクラス
public static void main(String[] args) {
/** データソース */
    private static DataSource ds__ = null;

    GSH2Util dbUtil = new GSH2Util();
    String dbPath = "C:\GS2DATA\db\gs2db";

    DataSourceModel dsModel = new DataSourceModel();
    dsModel.setUrl(dbUtil.createUrl(dbPath));
    //セッター部分省略---------------//

    DataSource ds__ = createDataSource(dsModel);
    Connection con = ds.getConnection();
}
    
    /** ロギングクラス */
    private static Log log__ = LogFactory.getLog(GSH2Util.class);
    /** DB PORT */
    private static final int DB_PORT__ = 9092;
    /** DB名 */
    private static final String DB_NAME__ = "gs2db";

    /** 接続文字列オプション */
    private static String jdbcUrlOption__ = null;

    static {

        //H2Database 接続オプションを取得する
        try {
            ResourceBundle optionResource = ResourceBundle.getBundle("connectOption");

            Enumeration keys = optionResource.getKeys();

            StringBuffer sb = new StringBuffer("");
            while (keys.hasMoreElements()) {
                String key = keys.nextElement();
                String value = optionResource.getString(key);

                if (!StringUtil.isNullZeroString(value)) {
                    sb.append(";").append(key).append("=").append(value);
                }
            }

            jdbcUrlOption__ = sb.toString();

        } catch (Exception e) {
            log__.info("H2 Database 接続オプションなし", e);
        }
    }

    /**
     * DB接続文字列を作成する
     * @param rootPath アプリケーションのルートパス
     * @return db url
     */
    public String createUrl(String rootPath) {
        String dbDir = GsDataSourceFactory.getDbDir(rootPath);
        String url = "jdbc:h2:" + dbDir + DB_NAME__ + File.separator + DB_NAME__;

        //接続文字列にオプションを追加
        url += jdbcUrlOption__;

        log__.debug("db_url==>" + url);
        return url;
    }
    
    //データソースを生成します
    public static DataSource createDataSource(DataSourceModel dsModel) {
        BasicDataSource bds = new BasicDataSource();
        bds.setDriverClassName(dsModel.getDriverClassName());
        bds.setUrl(dsModel.getUrl());
        bds.setUsername(dsModel.getUser());
        bds.setPassword(dsModel.getPass());
        bds.setValidationQuery(dsModel.getValidationQuery());
        bds.setDefaultReadOnly(dsModel.isDefaultReadOnly());
        bds.setDefaultAutoCommit(dsModel.isDefaultAutoCommit());
        bds.setMaxIdle(dsModel.getMaxIdle());
        bds.setMaxActive(dsModel.getMaxActive());
        bds.setMaxWait(dsModel.getMaxWait());

        bds.setRemoveAbandoned(true);
        bds.setRemoveAbandonedTimeout(600);
        return bds;
    }
    
H2 オプション

H2 をサーバモード、組み込みモードで使用する際に数多くのオプションの中から用途に合わせて設定することができます。
下記表は数多くある設定項目の中からGroupSessionで使用しているオプションをご紹介します。

GroupSessionで使用しているDBオプションは下記の通りです。

設定ファイル connectOption.properties にこれらを記述しています。

オプション 内容
設定値 初期値
LOCK_MODE テーブルロックについての設定を行います。
0=READ_UNCOMMITTED, 1=SERIALIZABLE, 2=SYSTEM LOCK, 3=READ_COMMITTED LOCK_MODE=1
LOCK_TIMEOUT テーブルロックタイムアウト時間の設定を行います。
ミリ秒で指定します。 LOCK_TIMEOUT=1000
DEFAULT_LOCK_TIMEOUT 新しいセッションに使用されるデフォルトテーブルロックタイムアウト時間の
設定を行います。
ミリ秒で指定します。 DEFAULT_LOCK_TIMEOUT=1000
MULTI_THREADED マルチスレッドでの使用についての設定を行います。
1=マルチスレッド、0=シングルスレッド MULTI_THREADED=0
IFEXISTS DBをオープンした時に指定パスが存在しない場合に新しいDBを作成するか
設定を行います。
TRUE=作成する、FALSE=作成しない IFEXISTS=TRUE
AUTOCOMMIT Auto Commit設定を行います。
ON=有効、OFF=無効 AUTOCOMMIT=OFF
DB_CLOSE_ON_EXIT VMが終了した時、データベースを終了するかを設定を行います。
TRUE=終了する、FALSE=終了しない DB_CLOSE_ON_EXIT=FALSE
CACHE_SIZE H2 Databaseのキャッシュサイズ。
CACHE_SIZE=32768
MAX_LENGTH_INPLACE_LOB BLOB、CLOBのin-place設定
MAX_LENGTH_INPLACE_LOB=10240
CACHE_TYPE H2 Databaseのキャッシュアルゴリズム。
CACHE_TYPE=SOFT_LRU
MVCC Multi-Version Concurrency Control (MVCC) についての設定を行います。
TRUE=有効にする、FALSE=無効にする MVCC=FALSE
H2 データタイプ

H2 では主要なデータタイプをサポートしています。詳細は[H2公式ホームページ]を参照してください。
下記表は数多くあるデータタイプの中からGroupSessionで使用しているデータタイプをご紹介します。


GroupSessionで主に使用しているデータタイプは下記の通りです。

[H2公式ホームページ]より抜粋

タイプ 内容
INT Type INT | INTEGER | MEDIUMINT | INT4 | SIGNED
VARCHAR Type {VARCHAR | LONGVARCHAR | VARCHAR2 | NVARCHAR | NVARCHAR2 | VARCHAR_CASESENSITIVE}[( precisionInt )]
TIMESTAMP Type {TIMESTAMP | DATETIME | SMALLDATETIME}
LOB Type {BLOB | CLOB}

Copyright 日本トータルシステム株式会社