2009-03-12 5 views
6

は私がfollwing方法contanins Databaseクラスがあります。C#静的データベースクラス?

  • パブリックブールExecuteUDIQuery(文字列のクエリを)// UDI =更新(挿入
  • パブリックブールExecuteSelectQuery(文字列のクエリ)
  • パブリックブールExecuteSPを削除します。方法の

結果に格納された文字列SP、文字列[、] PARMS)

  • 公共INT ExecuteSPReturnValue(文字列SP、文字列[、] PARMS)プライベートデータセットまたはデータセット。これらのオブジェクトはgetterとして定義されています。

    データベースクラスを使用する約10のクラスがあります。すべてのクラスは、クラスデータベースのオブジェクトを作成します。今私はデータベースクラスを静的にすることを考えていました。これは良いアイデアですか?もしそうなら、なぜですか?そうではないのはなぜですか?

  • 答えて

    5

    私が理解すれば、データベースクラスにはクエリの結果を格納するいくつかのプロパティがありますか?その場合、スレッドセーフではないため、静的にすることはできません。クエリの結果がこれらのプロパティに格納されている場合、最初のクエリの直後に2番目のクエリが実行されるとどうなりますか?同じ静的変数に格納されます。同じことがWebアプリケーションにも当てはまります。サイトを閲覧している別のユーザーの結果によって、最初のユーザーの結果が変更されます。

    EDIT:要約すると、クエリの結果を静的変数に格納するときにクラスを静的にしないでください。特に、クラスがWebサイトで使用されているときは、プロパティ値がすべての訪問者に共有されるためウェブサイト20人の訪問者が同時に質問をすると、訪問者1は訪問者20の質問の結果を見る。

    +0

    私はウェブサイトを構築しています。だから私は正しく、20人の訪問者を言うと、彼らはすべて別のページ(と私のDBクラスは静的です)を要求するとき、それは間違って、正しく行くあなたを理解していますか? – Martijn

    +0

    はい、正しく理解しています。クラスが静的である場合、プロパティはアプリケーション間で共有されます。したがって、20人の訪問者がデータベースクエリを行う場合、プロパティは訪問者番号20によって実行される最後のクエリの結果を保持します。 – Razzie

    0

    DBに対してクエリを実行しているだけの場合は、静的にします。このオブジェクトが何らかの状態を保持する必要がある場合にのみ、インスタンスを作成する必要があります。

    0

    静的メソッドを使用している場合は、データベースを開いたり閉じたりするときにインスタンスを追跡する必要があります。

    だから、あなたがしたいことは、インスタンスまたは現在のインスタンスと呼ばれる静的メソッドを持つことです。そして、あなたの中で、dbクラスの新しいインスタンスを作成して静的メソッドで返します。

    +0

    「インスタンス」を開いたままにすることはお勧めできません。 DB ASAPへの接続を閉じる必要があります。 – Inferis

    +0

    もちろん、接続を閉じる必要があります。しかし、コマンドにアクセスするための静的なクラスがあれば、その中のデータ接続を管理できます。終了後、読者を閉じるコマンドがあります。 –

    4

    具体的な例では、クラスを静的にすることをお勧めします。データベースクラスで状態を保持し、クラスを静的にすると、その状態はデータベースを使用するすべてのクラスで共有されます。あなたの現在のセットアップでは、各データベースインスタンスは独自の状態を保持しているため、データベース呼び出しが互いに干渉することは問題ありません。

    メソッド呼び出し時にデータベースクラスがデータセットを返すようにリファクタリングすると、静的にすることができます。ステートフルな情報はデータベースクラスに残されません。

    しかし、これは当てはまりません:いいえ、クラスを静的にしないでください。

    +2

    私はInferisに同意します。データベースクラスへのアクセスを容易にするファサードクラスを作成することもできます。 – Statement

    1

    使用しているデータベースやORMの種類によって異なります。しかし、私の経験では、それは良いアイデアのように思えましたが、私を軸化させました。これはLINQ-to-SQLで私にとってどうしたのですか。

    私はデータコンテキストに対する静的変数を持つリポジトリクラスを持っていました。最初はうまくいきましたが、さらに多くのリポジトリクラスを作成する必要が生じたとき、私はハックしながらバグを取得しました。 LINQ-to-SQLのデータコンテキストはすべての結果をキャッシュし、リフレッシュする方法はないことが判明しました。したがって、あるコンテキストでテーブルに投稿を追加した場合、そのテーブルをキャッシュした他のテーブルには表示されません。解決策は、静的修飾子を削除し、リポジトリにコンストラクタのコンテキストを作成させることでした。リポジトリクラスは使用されたときに構築されたので、新しいデータコンテキストも新しくなります。

    静的変数はメモリ内の占有面積は少なくなりますが、データコンテキストのフットプリントは非常に小さく、最後にガベージコレクションされます。

    2

    スレッドの安全性に関する他のコメントに加えて、パラレル化の問題もあります。あなたのケースでは、データベースへの複数の接続を同時に開くことはできず、結果のスレッドの安全性に問題がない場合でも、複数のパラレルクエリを実行することはできません。

    私は他の人に同意するので、静的なクラスを作成しないでください。

    クラスを静的にすることは便利ですが、新しいインスタンスを作成することはおそらく高価な操作ではないため、パフォーマンス面ではあまり効果がありません。

    編集:
    ウェブサイトでクラスを使用したいというコメントがありました。その場合、あなたは本当にこれを行うべきではありません。静的データベースクラスを使用すると、いつでも1つのリクエストを安全に処理できます。これはあなたが望むものではありません。

    0

    あなたのメソッドは、静的な使用に適しています。私は今、あなたは静的メソッドに変換するのに問題はないと思う。

    ですが、後でトランザクションを管理する必要があります。トランザクション管理をクラスに任せることは、私が思うに多くの時間を節約します。このシナリオは非静的クラスに最も適しています。

    1

    回答投稿とは逆です。 私は静的なデータベースアクセスでWebフレームワークを構築しました。

    http://www.codeplex.com/Cubes