犯人は誰だ!?
昨日のJBoss+Derby設定を行ってJBossを起動すると、data/derbyディレクトリにdefaultなる名称のデータベースが作成されているようだ。犯人は誰だ(バレバレだけど)!?
犯人は、どうも org.jboss.jdbc.DerbyDatabase みたい。derby-ds.xmlの最後のほうの以下の内容にデータベース名が設定されていないため、defaultという名のデータベースを作成してる。
なので、以下のようにしてデータベース名をURLから引っ張ってきて設定してあげることに。
localDB
これでOK。
とは行かないのが世の常で、どうもちゃんとデータベースがシャットダウンされていないことに気が付いた。JBossを停止してもデータベースディレクトリにロックファイルが残っちゃってるよorz
なんか、テストされてない感がただよってるねぇ。そもそも、データベースの起動もシャットダウンもしないんだから、mbeanの指定がある意味がないね(URLにcreate=trueがあれば)。
そこで、org.jboss.jdbc.DerbyDatabaseのstopServiceメソッドを以下のとおりに修正。
protected void stopService() throws Exception { String conURL = connection.getMetaData().getURL(); String dbURL = "jdbc:derby:;shutdown=true"; if (conURL != null) { int idx = conURL.lastIndexOf(';'); dbURL = ( (idx < 0) ? conURL : conURL.substring(0, idx) ) + ";shutdown=true"; } try { log.info("stopping derby " + dbURL); DriverManager.getConnection(dbURL); log.error("According to the docs, should have caught an exception!"); } catch(SQLException e) { String sqlstate = e.getSQLState(); if ("XJ015".equals(sqlstate) || "08006".equals(sqlstate)) { log.info(e.getMessage()); } else { log.info("Derby shutdown failed. state=" + e.getSQLState(), e); } } connection = null; }
これで大丈夫みたい(上記のロジックはJackrabbitからパクりました)。