WicketでS2Containerを動的に切り替えたらウマーでしょうか
BirdieMartのアーキテクチャを考えています。
(以前の日記に書いたものは現状のものであって決定ではありません。)
オープンソースなのだから、独自コンテナ、独自DBライブラリとかやめようよという声も聞こえます。
それでどうしようかなぁと、同僚の中国人の方と話し合ったりしました。
検討時のマトリックス
View | コンテナ | DBライブラリ | 知名度 | Wicketとの相性 | コミュニティ | 自由度 | 実績 | 導入コスト | 備考 | |
---|---|---|---|---|---|---|---|---|---|---|
Wicket | 独自 | 独自 | × | △ | × | ◎ | ○ | ○ | 自社実績大 | |
独自 | DBUtils | ○ | ○ | △ | ◎ | × | △ | |||
Spring | SpringJDBC | ◎ | ◎ | ○ | ? | × | ◎ | 世界的な実績大 | ||
Spring | Hibernate+JPA | ◎ | ◎ | × | ? | ○ | ◎ | Wicket-jaのソースと同じ | ||
Seasar2 | S2JDBC | ○ | △ | ◎ | ? | △ | ◎ | 日本語資料豊富 | ||
Guice | DBUtils | ○ | ◎ | △ | ○ | △ | ○ | Wicket界でGuiceは標準的 | ||
Guice | ActiveObjects | ○ | ◎ | △ | × | △ | ○ | ActiveRecordはあわないかも | ||
Guice | 独自 | × | ○ | × | ○ | △ | △ |
やっぱりここは手堅くGuice+DBUtilsがよさそうかなとも思ったのですが、
しかし、せっかく「日本発」オープンソースを銘打ってるんだから、国産フレームワークSeasarを検討しない手はないのじゃないかと思います。
そこで、今週はSeasar2を勉強してみます。
WicketでSeasar2
WicketとSeasar2の連携は、Wicket標準ライブラリではサポートされていません。
Seasar2を使うためには、Wicket-jaのid;t_yanoさんが作られた、wicket-seasar2ライブラリが使用できます。
http://d.hatena.ne.jp/t_yano/20090118/1232287169
また、id;t_yanoさんの方でサンプルソースも提供してくださっているので、それをまずはいじってみます。
svn co http://www.javelindev.jp/repos/share/wicketseasar2sample
チェックアウト後、maven2で
mvn jetty:run
さて、次なることは、とりあえず、DBを変えてみましょう。
実案件ではPostgreSQLを使うことが多いので、PostgreSQL 8.3で動かしてみます。
最初はどこをどうしたらいいのかわからなかったのですが、app.diconを以下のようにすれば動きました
<components> <!-- <component name="datasource" class="org.h2.jdbcx.JdbcDataSource"> <property name="URL">"jdbc:h2:~/test"</property> <property name="user">"sa"</property> <property name="password">"sa"</property> </component> --> <component name="datasource" class="org.postgresql.jdbc3.Jdbc3SimpleDataSource"> <property name="serverName">"localhost"</property> <property name="databaseName">"wicketseasar2sample"</property> <property name="portNumber">"5432"</property> <property name="user">"postgres"</property> <property name="password">"postgres"</property> </component> <component name="address1" class="jp.javelindev.wicket.seasar2.sample.bean.Address"> <property name="address1">"住所1"</property> <property name="address2">"住所2"</property> </component> <component name="user1" class="jp.javelindev.wicket.seasar2.sample.bean.User"> <property name="name">"テストユーザ"</property> <property name="address">address1</property> </component> <component name="address2" class="jp.javelindev.wicket.seasar2.sample.bean.Address"> <property name="address1">"住所3"</property> <property name="address2">"住所4"</property> </component> <component name="user2" class="jp.javelindev.wicket.seasar2.sample.bean.User"> <property name="name">"テストユーザ2"</property> <property name="address">address2</property> </component> </components>
もちろんpom.xmlの修正も必要です。以下のようにします。
<-- <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.1.104</version> </dependency> --> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>8.3-603.jdbc3</version> </dependency>
次はコネクションプーリングしたいですね。
<component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl"> <property name="driverClassName">"org.postgresql.Driver"</property> <property name="URL">"jdbc:postgresql://192.168.1.210:5432/wicketseasar2sample"</property> <property name="user">"postgres"</property> <property name="password">"postgres"</property> </component> <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl"> <property name="timeout">600</property> <property name="maxPoolSize">10</property> <property name="allowLocalTx">true</property> <!--<property name="validationQuery">"select * from dual"</property>--> <!--<property name="validationInterval">10000</property>--> <destroyMethod name="close"/> </component> <component name="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
こんな感じでやったんだけど動かなかったorz
diconとの格闘がSeasar2の本質なのでしょうか?
とはいえ、diconの修正だけで、いろいろなことができるのは、やっぱりさすがですね。
そこで、新たなる野心が!!
現状のコードだと、S2ContainerはSingletonS2ContainerFactoryを使って取得しています。
これをやめて、動的に切り替わるようにしたら、自由自在にカスタマイズができるのではないでしょうか?
そうすれば、diconに相当する情報さえ動的生成できれば、かなり柔軟に作れるような気がします。
しばらくSeasar2を勉強してみます。