2

タイトルが少し悪いように見えることは知っています:)しかし、私の問題を説明する方法がわかりません..

これは通常、私にとって基本的な問題ですが、答えがわかりません..

クライアントとサーバーの通信にeneterライブラリを使用し、データベースからデータを取得するDALを持つサーバーアプリケーションを作成しています。サーバーアプリケーションなので、常にデータベースと通信する必要があるため、どの方法がより効果的かわかりません。(約、最大 50 クライアントがサーバーに接続されます)

エンティティ フレームワークを使用しており、mysql db からモデルを作成しました。

最初のコードはこちら

    private MyEntities ent;

    public DbHelper()
    {
     ent = new MyEntities();
    }

   void Foo()
  { 
       ent.Mytable.where......
       ....

  }

2番目のタイプコードは

    void Foo()
    {
        using (MyEntities ent = new MyEntities())
        {
            ent.Mytable.where...
        }

    }

using ステートメントを使用するか、dal クラスのグローバルインスタンス変数を作成して、各関数に使用できますか?

4

4 に答える 4

2

さらに良いことに、DAL クラスに IDisposable を実装します。

public sealed class MyDal implements IDisposable
{
    private MyEntities ent = new MyEntities();

    void Foo()
    { 
       ent.Mytable.where......
       ....

    }

    public void Dispose()
    {
        ent.Dispose();
    }
}

それで...

using(var dal = new MyDal())
{
    dal.Foo();
    //....
}

IDisposable が封印されている理由については、こちらをお読みください。

于 2013-06-02T12:42:22.057 に答える
1

2 つのアプローチは、変更追跡の範囲という点で大きく異なります。どちらも同じように機能する場合は、必ず を使用してWithNoTrackingください。

最初のコードのように、エンティティのメンバー変数を作成できます。using(){}ただし、その周りにステートメントを書くことはできないため、含まれるクラスはIDisposable. そして、消費するクラスはそれを a 内で使用する必要があります using(){}

于 2013-06-02T12:41:05.947 に答える
1

パフォーマンスの観点からは、問題ありません。実際のデータベースとのやり取りと比較して、コンテキスト インスタンスの作成は非常に高速な操作です。

ただし、作成されたコンテキストはデータベース接続をネイティブ リソースとして保持するため、いずれの場合も破棄する必要があります。

クラスでコンテキスト メンバーを操作する場合は、インスタンス自体が破棄されたときにコンテキストを破棄できるように、DbHelperこのクラスを実装する必要があります。IDisposableDbHelper

public class DbHelper : IDisposable
{
    private MyEntities ent;

    public DbHelper()
    {
        ent = new MyEntities();
    }

    public void Foo()
    {
        //...
    }

    public void Bar()
    {
        //...
    }

    public void Dispose() // implementation of IDisposable
    {
        ent.Dispose();
    }
}

次に、このクラスをusingブロックで使用できます。

using (var helper = new DbHelper())
{
     helper.Foo();
     helper.Bar();
} // helper and helper.ent gets disposed now
于 2013-06-02T12:44:06.347 に答える
1

これは、他にどのようなメソッドが存在し、何をするかによって異なります。ORM を使用して変更を行い、それらの変更を保持する場合は、オブジェクトを作成したデータ コンテキストが必要になります。また、同じものを 2 回クエリしたときに ID マネージャーが同じオブジェクト インスタンスを提供するようにする場合は、同じデータ コンテキストを使用する必要があります。そのため、手元に置いておく必要があります。最後に、型が遅延読み込みを使用していて、それが機能することを期待している場合、データコンテキストを破棄した場合、それは機能しません。

ただし、変更の追跡、遅延読み込み、または ID 管理を行わずにデータへの読み取り専用アクセスのみが必要な場合は、積極的に破棄してください。そして、単にそれらの機能を持たないマイクロ ORM のようなものを検討してください (意図的に、最小限かつ高速にするため)。

于 2013-06-02T12:45:15.647 に答える