質問: 初めて質問いたします。 只今、DBアクセスを伴う簡易な良くあるWebアプリを設計中です。 ロジック層とデータアクセス層を分割するため DAOクラスを用いて、データベースアクセスを行わせようと考えています。 突然ですが、ここで質問なのですが、 DAOクラスはシングルトンにして、アプリ内で共有するのが一般的なのでしょうか? 以下の記事等いくつかのサイトで、共有するべき(一般的?)・・・という感じで書かれていました。 参考)http://oshiete1.goo.ne.jp/qa324356.html 今まで自分が作成してきた設計では、 1トランザクションで、複数のDAOやDAOのメソッドを実行する必要があったので(こちらが一般的だと思いますが)、daoクラスのインスタンス生成時などに コネクションやDataSource(またはそれらをラップしたもの)等を渡し、当然はそれぞれのリクエスト(スレッド)で固有である必要があるため、各リクエスト毎に、インスタンスを生成するようにしておりました。 シングルトンにした場合でも、ThreadLocal等を用いれば、共有することが可能だと思いますが、これが一般的な手法とは思えないのですが、実際のところは同なのでしょうか? 実装方法は自由ですし、どんな方法でも実現可能だとは思いますが、経験豊かな皆様はどのようにお考えでしょうか? ご意見を伺えればと思います。 P.S 「一般的」という言葉に引っかかり過ぎでしょうか。。。
回答: kjさん、ありがとうございます。 >それで、私にはどのトランザクションの議論をしているのか分かっていません。 →途中参加で申し訳ありませんが、私は、題名が「DAOクラスの設計について」なのでDBトランザクションの論議だと認識しています。(単純で申し訳ないです) 論点として、 ・同一DBトランザクションのコネクションを、どのようにクラス間、メソッド間で流通させるべきか? ・そのために、コネクション生成・DBトランザクションの開始・終了は、どのレイヤが担当すべきか? ・上記もろもろを考慮すると、カッコイイDAOの設計は? などかと勝手に思っているのですが、これはmame豆さんに聞いてみないと分かりません・・ kjさんの言われる、もう一方のトランザクション話は、サーバサイドアプリ全体の設計に広がってしまうので、このページが非常に縦長になってしまうと思われます。 実は、2008-11-10 09:40の「DAOがビジネスロジックを持つべきか」あたりも興味深く読ませて頂いておりました。 かのmartinfowlerさんは、こんな事おっしゃってましたし。 http://capsctrl.que.jp/kdmsnr/wiki/bliki/?AnemicDomainModel