技術情報
GroupSession
H2 Database Engineの概要
H2の特徴
・Javaで作成されている
・フリーで利用できる
・高速に動作する(*1)
・コンパクトなファイルサイズ(1MB程度)
・複数の起動モード(*2)
*1:公式ページに処理性能の比較表が掲載されています。
*2:組み込みモード、サーバモード、クラスタモードがあります(GroupSessionは組み込みモードで動作しています)。
技術情報
GroupSessionを開発する過程で調査したH2に関する技術情報をご紹介します。
Javaプログラムから組み込みモードで使用する
JavaプログラムからH2 を組み込み(Embedded)モードで使用するため「jdbc:h2:[file:][<path>]<databaseName>」形式の接続文字列を生成しています。
GroupSessionでは接続文字列と設定ファイル(dataSource.xml、connectOption.properties)を元にデータソースを生成しています。
JavaプログラムからH2を組み込みモードで使用する例
public static void main(String[] args) throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection(
"jdbc:h2:file:{H2Database設置フォルダ}¥db¥gs2db¥gs2db;",
"username",
"password");
//
// プログラムコード
//
}
dataSource.xml、connectOption.propertiesを使用したコーディング例(DataSource使用)
public static void main(String[] args) {
/** データソース */
private static DataSource ds__ = null;
GSH2Util dbUtil = new GSH2Util();
String dbPath = "{H2Database設置フォルダ}¥db¥gs2db";
DataSourceModel dsModel = new DataSourceModel();
dsModel.setUrl(dbUtil.createUrl(dbPath));
//セッター部分省略---------------//
DataSource ds__ = createDataSource(dsModel);
Connection con = ds.getConnection();
}
public static void main(String[] args) {
/** データソース */
GSH2Util dbUtil = new GSH2Util();
String dbPath = "{H2Database設置フォルダ}¥db¥gs2db";
//dataSource.xmlからDataSourceの情報を取得
DataSourceModel dsModel = new DataSourceModel();
dsModel.setUrl(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で使用しているオプションをご紹介します。
設定ファイル 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で使用しているデータタイプをご紹介します。
タイプ | 内容 |
---|---|
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} |