GroupSessionで使用しているデータベースはH2 Database Engine(以下H2という)です。
H2をGroupSessionに採用した理由として、H2がどの様なデータベースエンジンなのかを技術情報と共にご紹介いたします。
H2は下記の特徴があります。
どの程度高速かというと[H2公式ホームページ]のトップページに処理性能のグラフを表示しているほど、処理パフォーマンスが非常に優れています。
将来性のあるハイパフォーマンスデータベースです。
GroupSessionを開発する過程で調査したH2に関する技術情報をご紹介します。
JavaプログラムからH2 を組み込み(Embedded)モードで使用するため
「jdbc:h2:[file:][<path>]<databaseName>」形式の接続文字列を生成しています。
GroupSessionでは接続文字列と設定ファイル(dataSource.xml、connectOption.properties)を元にデータソースを生成しています。
※詳細はGroupSession Version3のソースを参照ください。
//データベースコネクションを取得するサンプルクラス
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");
//
// プログラムコード
//
}
//データベースコネクションを取得するサンプルクラス
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 をサーバモード、組み込みモードで使用する際に数多くのオプションの中から用途に合わせて設定することができます。
下記表は数多くある設定項目の中から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公式ホームページ]を参照してください。
下記表は数多くあるデータタイプの中から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} |