覚えている方はお久しぶりです。
初めての方、覚えていない方ははじめまして(?)
常角です。
久々の開発ブログ。
さて、何にしようかと考えて、
最近仕事でやったStrutsで複数のDBに接続しに行く方法にしました。
単体のシステムではあんまりないのですが、複数のシステムを連携させる場合にあり得るシチュエーションかもしれません。
で、早速やり方です。
まず、DBへの接続情報を書き込む
jdbc.dicon
というファイルを同じフォルダ内にコピーして、
jdbc1.dicon
jdbc2.dicon
というファイルを作ります。
(ここのファイル名は別になんでもいいです)
そのそれぞれのファイルに接続したいDBへの接続情報を書き込んでやります。
その後、元々のjdbc.diconファイルを次のように書き換えてやります。
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="jdbc1.dicon"/> <include path="jdbc2.dicon"/> </components |
これで、jdbc1とjdbc2の情報を読み込むようにできます。
次です。
jdbc.diconと同じフォルダに
dao.dicon
というファイルが有るはずです。
これをコピって、
dao1.dicon
dao2.dicon
を作りましょう。
で、下のようにjdbc1,jdbc2をインクルードするように設定を変えてやりましょう。
namespaceをdao1,dao2にすることも忘れないで下さい。
特に何もなければ、daoの変更はこれだけでいいです。
1 2 3 4 5 |
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components namespace="dao1"> <include path="jdbc1.dicon"/> |
1と2で変更が完了したら、元のdao.diconを次のように変更してやりましょう。
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="dao1.dicon"/> <include path="dao2.dicon"/> <include path="j2ee.dicon"/> </components> |
jdbc.diconと同じですね。
1と2の両方を読み込め!っていうふうに書き換えてやります。
次、最後です。
customizer.dicon
というファイルが有るはずです。
コンポーネントに「daoCustomizer」ってのがあると思います。
その中に、次のように書き加えてあげてください。
1 2 3 4 5 6 |
<initMethod name="addCustomizer"> <arg>dao1SupportAspectCustomizer</arg> </initMethod> <initMethod name="addCustomizer"> <arg>dao2SupportAspectCustomizer</arg> </initMethod> |
上の方で作ったdao1とdao2を追加してやります。
更に次のようなコンポーネントを追加してやります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<component name="dao1SupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"dao1.interceptor"</property> <initMethod name="addClassPattern"> <arg>"sample.dao"</arg> <arg>".*Dao"</arg> </initMethod> <initMethod name="addIgnoreClassPattern"> <arg>"sample.dao.another"</arg> <arg>".*Dao"</arg> </initMethod> </component> <component name="dao2SupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"dao2.interceptor"</property> <initMethod name="addClassPattern"> <arg>"sample.dao.another"</arg> <arg>".*Dao"</arg> </initMethod> </component> |
これが、どんなことを行っているかというと、
sample.daoの中にある、すべてのdaoファイルの処理を実行する場合、dao1(jdbc1)の接続情報を使って、DB接続を行う。
但し、sample.dao.anotherのみ、対象外にする
sample.dao.anotherの中にある、すべてのdaoファイルの処理を実行する場合、dao2(jdbc2)の接続情報を使って、DB接続を行う。
ということです。
(当たり前ですが、お使いのプロジェクトに合わせて設定を変えてやってくださいね)
この設定自体は、おそらく元々あるはずです。それを接続情報が2つに別れたから、設定も2つに分けるというイメージです。
上記の例では、daoパッケージ内のanotherパッケージの中のDAOファイルのみ2の方の設定で接続する。
としていますが、もちろん
dao.oneパッケージをjdbc1で接続。
dao.twoパッケージをjdbc2で接続。
というふうに分けることもできます。
これで以上、複数のDBに接続しに行くようになっているはずです。
ややこしいようで、終わってみれば結構簡単だったりします。
やったことないですが、多分同じ要領で接続先を3つにも4つにも増やせるかと思います。
(そんなことをするシステムなんてどうかと思いますが)