今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

HSQLDBが無応答になる

今日、専門学校の授業中の話。生徒の一人からHSQLDBが無応答になって困っているとの質問。授業で、Servlet+JSP掲示板システムを作っていて、掲示板に書き込んだ内容をHSQLDBに保存するために、Connectionを取得しようとするところで問題が発生していた。
Connectionを取得するメソッドを作成。

    private Connection getConnection() throws SQLException {
        String driverUrl = "jdbc:hsqldb:hsql://localhost";
        Connection con = DriverManager.getConnection(driverUrl, "SA", "");
        return con;
    }

他のみんなは問題なく動作しているのに、ひとりだけここでハングしたような状態になってる。同じパソコンで、HSQLDBに付属の Database Manager を EclipseHSQLDBプラグインから使ってみたところ、問題なく接続できるし、SQLもきちんと動作する。なぜか Servlet だと動作しない。DriverManager.getConnection()を呼ぶところまでは動作しているのに、復帰しないし例外も発生しない。ほんとうにそこで止まっているのかを確認するために、HSQLDBを止めてみた。すると、例外が発生して Connection の取得に失敗。まあ、復帰してこないのは別として、データベースを止めたら例外が発生してくれるのは期待通りの動作。
ぐぐってみたら、英語の掲示板みたいなところで、「HSQLDBでDriverManager.getConnection()を呼び出して5分待ってもハングしたままで困ってるから誰か教えてー」みたいな質問を発見。でも誰も回答してないし。
内部的にやってることは大したことないのに戻ってこないというのは、明らかに何かがおかしい。
ふと思い立って、$ECLIPSE_DIR/plugins/hsqldb.core/hsqldb.jar を WEB-INF/lib にコピーしなおした。そして、EclipsetomcatHSQLDB を再起動して、掲示板を動かしたら、すんなり動いた!
どうやら、WEB-INF/lib/hsqldb.jar が壊れていたらしい。