Java H2DB 接続が壊れています

H2DBエラー

H2DBをTomcatで使用し始めて、DBコネクションを取得しようとしたときに下のようなエラーが出ました。

org.h2.jdbc.JdbcSQLNonTransientConnectionException: 接続が壊れています: "java.net.SocketTimeoutException: > connect timed out: localhost"
Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:622)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:194)
at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:439)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:321)
at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173)
at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152)
at org.h2.Driver.connect(Driver.java:69)

考えられる原因は、以下の通りです。

  1. H2DBをサーバーモードで使用していない
  2. URLの指定方法がおかしい

実際のコードは下のようなものです。

try {
    Class.forName("org.h2.Driver");
    con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/database");
    Statement stmt = con.createStatement();
    stmt.execute(SQLConst.CREATE_USER_TBL);
    stmt.execute(SQLConst.CREATE_ITEM_TBL);
    stmt.execute(SQLConst.CREATE_ITEM_TYPE_TBL);
} catch (SQLException e) {
    e.printStackTrace();
    System.exit(-1);
} catch (Exception e) {
    e.printStackTrace();
    System.exit(-1);
}

解決

ちょっと特殊な解決方法でしたが、シンプルにH2DBをサーバーで起動してやれば大丈夫でした。
具体的な手順は以下の通りです。

H2DBのサーバーを起動する

H2をインストールしたディレクトリにある、「h2.bat」もしくは「h2.sh」を起動すればOK

もしくは、Windowsの場合にウィンドウズボタンからのアプリケーション「H2Console」を起動して対象のDBファイルにアクセスすればOK

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す