開発はServerモードで進めていたのだが、Embeddedモードの方が更に高速で、APサーバーと同じVM上で動作するので、
APサーバー起動時に、DBも起動って感じで一手間省けておいしいかなぁーと思って試してみた。
s2jdbc使っているので、jdbc.diconを修正して終わり。すげー簡単です。
サーバーモード:
<component name="xaDataSource"
class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">
"org.h2.Driver"
</property>
<property name="URL">
"jdbc:h2:tcp://localhost:9092/hoge_db"
</property>
<property name="user">"hoge"</property>
<property name="password">"hoge"</property>
</component>
組み込みモード:
<component name="xaDataSource"
class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">
"org.h2.Driver"
</property>
<property name="URL">
"jdbc:h2:file:"
+ @org.seasar.framework.util.ResourceUtil@getBuildDir('app.dicon').getCanonicalPath()
+ "/data/hoge_db;DB_CLOSE_ON_EXIT=FALSE"
</property>
<property name="user">"hoge"</property>
<property name="password">"hoge"</property>
<destroyMethod>
@org.seasar.framework.util.DriverManagerUtil@deregisterAllDrivers()
</destroyMethod>
</component>
この例だと、app.diconのある場所(WEB-INF/classes)のdata以下に、DBファイルが作成される。
開発時、クリーンビルドしちゃうと、消えてしまうので注意。
うまくいったから、採用しようか検討していたら落とし穴があった。
Embeddedモードだと、外部から接続はできない・・・・
APサーバーがファイルをつかんでしまうため、DBに他のツールで同時にアクセスすることができないようだ。
これはこれで開発時には面倒だ。DBViewerとかで内容見たくても、見れない。
そもそも、今のシステムはJamesというメールサーバーからもDBアクセスがあるので致命的。
結局、サーバーモードに戻しました。まあ、組み込みの体験をしてみたということで良しとしよう。
以上