2009-03-12 6 views
2

すぐに私の教訓の開発段階を開始するつもりです。現在の設計では、データベース接続とそれを呼び出す多くのクラスを扱う単一のクラスを用意しています。データベースクラスは接続を開いて盲目的にクエリを渡し、他のクラスはそれらのクエリの内容を担当します。多くのクラスがデータベース接続クラスを参照するための最良の方法

私が知りたいことは、これらのリファレンスがデータベースクラスについて知る最良の方法は何か?私の本能は、データベースクラスのメソッドを静的にしてDatabase.method()として呼び出すことですが、より良い方法がありますか?

P.S.これについて正しい言葉を参照していましたか?正しい言葉が何であるかわからなければ、次回は同様の疑問を抱くのに役立ちます。

答えて

6

注意してください。

シングルトンはボトルネックになります。

java.sql.Connectionはスレッドセーフではないため、そこに問題が発生する可能性があります。

私はサービスと永続性レイヤーを完全に分離して書いておくことをお勧めします。どちらもインターフェイスに基づいている必要があります。サービスレイヤーは、モデルと永続オブジェクトを使用してそれらを実行する作業単位とトランザクションの単位を知っているものです。サービスは、Connectionを取得し、永続性層で使用可能にし、トランザクションを処理し、Connectionが作成されたのと同じメソッドスコープでConnectionを終了する責任があります。

スコープとクリーンアップが鍵です。これをしないと、データベース接続が使い果たされます。

接続プールについては言及していません。私は1つをお勧めしたい。

春をご覧ください。そのJDBCモジュールは、このすべてを美しく処理します。あなたの割り当てにSpringを使用できない場合は、実装をどのように設計するかは良いモデルになります。

1

静的なものは避けてください。好ましい値は"Parameterisation from Above"である。

あなたがしたいことは、あなたの「メイン」の近くにデータベースラッパーオブジェクトを作成することです。その後、それを必要とするオブジェクトにコンストラクタ引数として渡します。

-1

Singleton patternがこれを手助けします。ここではmore infoを参照してください。

本質的に、オブジェクト指向の世界では避けられるべきグローバルなメソッド群を作り出しているので、パターンは正しくありませんが(しかし、コースワークと達成しようとしているものについては)それは最も簡単かもしれません。

+0

私はあなたの授業でそれを避けるといいです。 – tddmonkey

+1

私はコードでシングルトンとモノステートを使用していますが、過去20年ほど悪影響を及ぼすことはありませんでした。これらはデザイナーツールボックスの単なる別のツールです。 –

0

あなたが提案したように行くなら、クラスをテストするのに苦労することになるでしょう。 1つの方法は、データベース情報をクエリを作成するクラスに渡すことです。あなたはDAOパターンを使用している場合

Query query = new GetPersonQuery(Database database); 
query.run(); // or whatever 

これには、特に問題なく動作します:

PersonDao dao = new PersonDao(Database database); 
dao.findAll(); 
データベースは、それはあなたが、例えば必要であるものは何でも包むことができ

接続プーリング、キャッシュなど

0

静的に接続を保存する場合は、少なくともスレッドローカルを使用します。しかし、他の人がここで述べたように、接続を使用する必要があるオブジェクトに接続やラッパーを挿入する方がよい。

4

伝統的なアプローチは、各データクラスに対してDAO(データアクセスオブジェクト)を持つことです。

I.e.データクラス "Person"がある場合、findById()、findAll()、save(Person)などのメソッドを実装する "PersonDAO"クラスもあります。基本的にDAOクラスはすべてのDB相互作用を処理します。

DAOクラスのコンストラクタはConnectionオブジェクトを受け入れるだけで、接続の作成の問題を外部化することも、Connectionオブジェクトを作成したファクトリメソッドを呼び出すこともできます。

どちらの場合でも、このようなファクトリメソッドが必要な場合があります。誰かが指摘

public class Database{ 
    public static Connection getConnection(){ 
     // Create a new connection or use some connection pooling library 
    } 
} 

として、あなたは、複数のスレッドがメソッドにアクセスすることはないと確信していない限り、あなたは同じ接続を毎回配るべきではありませんので、java.sql.Connectionのはスレッドセーフではありません。

もちろん、各通話に新しい接続を作成する必要がある場合は、接続が完了したら接続を閉じる必要があります。簡単な方法は、DAOにclose()メソッドを追加して、それを処理させることです。これは、DAOを使用するコードに負担をかけます。

接続プールを使用しても、完了したら接続を閉じて(プールに戻る)必要があります。

スレッドごとに接続するには、スレッドローカルを使用することをお勧めします。これは場合によっては機能しますが、各リクエストが新しいスレッド(再利用されることはなく、参照を保存しない可能性があります)であるWebアプリケーションには役に立ちません。

ただし、各リクエストを処理した後にTreadローカル接続(存在する場合)を閉じるDatabase.closeConnection()が呼び出されるように設定した場合、これをWebアプリケーションで利用できます。

関連する問題