犯人は誰だ!?

昨日の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からパクりました)。