H2 Database Engine (H2DB) の環境構築

H2 Database Engine (以降本書中ではH2DBと記載します) のWindwos環境下におけるインストールから、サーバモードでの起動方法、お使いのデータベース開発支援ツールとの接続方法（ODBC使用）までをまとめておきます。

# インストール手順

1. [H2DBのサイト](http://www.h2database.com)から「Windows Installer」をダウンロードする。（「h2-setup-yyyy-mm-dd.exe」のようなファイルがダウンロードされる）

![1_edt.png](https://qiita-image-store.s3.amazonaws.com/0/105193/8717b98b-ce6a-f95a-4629-22384bf955ac.png)

2.インストール

ダウンロードした「h2-setup-yyyy-mm-dd.exe」ファイルを実行しインストール。
「次へ」「インストール」なにも変更しない場合は、２～３ステップで完了。
![no2.png](https://qiita-image-store.s3.amazonaws.com/0/105193/069fd711-a0c3-1159-b391-906be1e64a32.png)

![no3.png](https://qiita-image-store.s3.amazonaws.com/0/105193/ada40a29-c05e-1005-380d-db37391facba.png)

デフォルトで「C:\Program Files (x86)\H2」にインストールされます。

# H2DBをサーバモードで起動する

H2DBに接続する方法は

+ *組込（Embedded）モード*:ローカルのDBファイルに直接アクセスします。
+ *サーバモード*:DBサーバとして起動するモード。

という種類があり、*組込モード*はインストール後、何も設定、起動せずにそのまま使用できます。
たとえば、jdbcでsampleというDBに接続するサンプルは以下の通り

```sampleへの接続手段
jdbc:h2:[file:]~/sample
```

チルダ（~）はホームディレクトリを示し（Windows7以降は「C:\Users\ユーザ名」）、これでホームディレクトリ配下にsampleというDBファイルが作成されます。

## 組み込みモードでは複数のアプリケーションから同時接続できない。

*組込モード*を使用すると例えばIDE環境で接続して試しながら、データベース（SQL）開発支援ツールなど別のアプリで接続しようとすると、以下のようなエラーに遭遇します。

> org.h2.jdbc.JdbcSQLException: データベースが使用中です: "...". 可能な解決策: 他の接続を全て閉じる; サーバモードを使う

問題は、エラーに記載されている内容の通りで、*組込モード*では複数のアプリから同時に使用することができません。
解決策の１つとして、エラーに記載されている解決策 *サーバーモード* があります。

## サーバーモードで起動する

### 準備

H2DBのbin直下にあるh2.batをコピーしてサーバーモード用に編集します。(以下はコピーして名前をh2-server.batにしました。)
![no6.png](https://qiita-image-store.s3.amazonaws.com/0/105193/118edfb8-39f7-783a-5b8c-1d9b06e53a26.png)

内容を

```bat:編集前
@java -cp "h2-1.4.196.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %*
@if errorlevel 1 pause
```

から

```bat:編集後
@set AS_JAVA=C:\PROGRA~1\Java\jdk1.8.0_151
@set JAVA="%AS_JAVA%\bin\java"
@set H2=C:\PROGRA~2\H2\bin\h2-1.4.196.jar

@java -cp "%H2%;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Server %*
@if errorlevel 1 pause
```

に編集します。
（※JDK1.8.0.151の64bit版をインストールしている前提です。）


### 実行

編集したバッチファイル（h2-server.bat）を実行します。以下は、実行直後に表示されるコマンドプロンプトです。
![no7.png](https://qiita-image-store.s3.amazonaws.com/0/105193/09f7adee-c512-c926-85ef-de15537a9014.png)

このバッチ（org.h2.tools.Server）は、ダブルクリックで実行できますが

```
h2-server.bat -tcpAllowOthers
```

など、いくつかのオプションを追加することも可能です。
（-tcpAllowOthersは、後述に記載していますが、tcp（サーバーモードの接続方法）での接続を外部端末からでもアクセスできるように許可します。

また、コマンドプロンプト上に3行表示されているのが確認できると思いますが、サーバーモード（org.h2.tools.Server）をオプションなしで実行した場合

1. サーバーモード（tcpサーバ）
2. PostgreSQLサーバ
3. webサーバ

の3つのサーバが同時に起動します。
以下は、起動時にコマンドプロンプトと同時にブラウザに表示されるwebサーバのトップ画面です。
![no8.png](https://qiita-image-store.s3.amazonaws.com/0/105193/8d5ea1bc-538a-f824-c29e-e38e638cd8a9.png)

### [付録]オプション

サーバモード起動時に、次のようなオプションを指定することが可能です。

```console:H2DBサーバモードのオプション
>java -cp "%H2%;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Server -?
Starts the H2 Console (web-) server, TCP, and PG server.
Usage: java org.h2.tools.Server <options>
When running without options, -tcp, -web, -browser and -pg are started.
Options are case sensitive. Supported options are:
[-help] or [-?]         Print the list of options
[-web]                  Start the web server with the H2 Console
[-webAllowOthers]       Allow other computers to connect - see below
[-webDaemon]            Use a daemon thread
[-webPort <port>]       The port (default: 8082)
[-webSSL]               Use encrypted (HTTPS) connections
[-browser]              Start a browser connecting to the web server
[-tcp]                  Start the TCP server
[-tcpAllowOthers]       Allow other computers to connect - see below
[-tcpDaemon]            Use a daemon thread
[-tcpPort <port>]       The port (default: 9092)
[-tcpSSL]               Use encrypted (SSL) connections
[-tcpPassword <pwd>]    The password for shutting down a TCP server
[-tcpShutdown "<url>"]  Stop the TCP server; example: tcp://localhost
[-tcpShutdownForce]     Do not wait until all connections are closed
[-pg]                   Start the PG server
[-pgAllowOthers]        Allow other computers to connect - see below
[-pgDaemon]             Use a daemon thread
[-pgPort <port>]        The port (default: 5435)
[-properties "<dir>"]   Server properties (default: ~, disable: null)
[-baseDir <dir>]        The base directory for H2 databases (all servers)
[-ifExists]             Only existing databases may be opened (all servers)
[-trace]                Print additional trace information (all servers)
[-key <from> <to>]      Allows to map a database name to another (all servers)
The options -xAllowOthers are potentially risky.
For details, see Advanced Topics / Protection against Remote Access.
See also http://h2database.com/javadoc/org/h2/tools/Server.html
```

記載の通り、プログラム中で使用したい場合などは、[javadoc/org/h2/tools/Server.html](http://h2database.com/javadoc/org/h2/tools/Server.html)を見るとよいです。

# データベース開発支援ツールで接続する

サーバモードで起動すると、ブラウザから付属のwebサーバ経由でアクセスすることも可能ですが、普段使用しているデータベース（SQL）支援ツールを使用して、操作したいものです。
Javaで作成されたツールであれば、urlに```jdbc:h2:tcp://localhost/~/sample```とすれば使用可能です。
そうでない場合、ODBC経由での接続が可能です。

## PostgreSQLのODBC経由で接続する。

デフォルトでサーバモードを起動した場合、PostgreSQLサーバも同時に立ち上がっているはずです。
これで、PostgreSQLのODBCを使用すれば、sampleデータベースにアクセスできます。

1 PostgreSQL ODBC Driverをインストール

[PostgreSQLのODBCドライバのダウンロードページ](http://www.postgresql.org/ftp/odbc/versions/msi/)から
psqlodbc_09_02_0100-x64.zipもしくはpsqlodbc_09_02_01000.zipをダウンロードします。
※これより最新のドライバをインストールしたところ、接続エラーが発生しました。。。

![no9.png](https://qiita-image-store.s3.amazonaws.com/0/105193/f7fff7a0-2b78-3272-d0b2-2c37e8b6f64e.png)


2 ODBC データソースアドミニストレータで設定を追加

ウィンドウズボタン＋R（ファイルを指定して実行）に```odbcad32.exe```を入力し実行して
ODBC データソースアドミニストレータを起動します。

次にユーザデータソースの状態で「追加」をクリックして

![no12.png](https://qiita-image-store.s3.amazonaws.com/0/105193/17c5f74c-d792-825a-a2e7-bf9361db6fa9.png)

PostgreSQL Unicode(x64)を選択して「完了」をクリック

![no13.png](https://qiita-image-store.s3.amazonaws.com/0/105193/09ca5630-0eaa-f89a-4ce9-2a0416eee51e.png)

セットアップ画面で以下のような接続情報を入力し（Portは5435になります）、テストし、接続が成功したら保存しましょう。

![no14.png](https://qiita-image-store.s3.amazonaws.com/0/105193/acb95c43-8545-9d51-d46a-181df88d8a09.png)

以下が成功した場合のダイアログ表示です。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/105193/7b425765-7647-de90-d9af-8d55268ddba6.png)

アドミニストレータ画面に以下のように追加されます。

![no17.png](https://qiita-image-store.s3.amazonaws.com/0/105193/e52afb63-5ec3-4c4f-e7bc-eb8988f393ef.png)


3 支援ツールで接続確認する。

例としてA5:SQL Mk-2を使用しての接続確認方法です。

A5:SQL Mk-2起動後、データベースの追加と削除から、「64bit ODBC ユーザデータソースを列挙する」のチェックボックスをチェックします。

![no18.png](https://qiita-image-store.s3.amazonaws.com/0/105193/2fa2abef-9d9d-10e9-2b1d-3f9437dda984.png)

すると、データベースの一覧に表示されるので、いつものとおり接続してみます。

![no20.png](https://qiita-image-store.s3.amazonaws.com/0/105193/f6569b65-0fbd-2b9b-2d44-5eb233aeefd5.png)

うまくつながりました。

# おわりに

Java開発（特にサーバサイド）で、H2DBを使って入門編を記載しているところ（書籍、サイト）がありますが、H2DBそのものの使い方を準備手順に含めて記載されておらず、入門編で実践した後に
「じゃあちょっと機能追加してみようか」
「H2DBのツールからの接続方法は？」
「編集しながら繋げられないの？」
「サーバーモードにしたら今度はソースがつながらない」
「知ってるSQL接続ツールで繋げられない＝H2DBに付属しているWebアプリでしか繋げられない。。。（他はjdbc使うツールだけ）」
「総じて使いにくくね？」

とならない、2歩目を進むための情報を提供したくてまとめてみました。