3

オブジェクトにはどのパターンが適していSqlConnectionますか? 性能的にはどちらが優れていますか?他のパターンはありますか?

class DataAccess1 : IDisposable
{
    private SqlConnection connection;

    public DataAccess1(string connectionString)
    {
        connection = new SqlConnection(connectionString);
    }

    public void Execute(string query)
    {
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            // ...

            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }

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

VS

class DataAccess2 : IDisposable
{
    private string connectionString;

    public DataAccess2(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public void Execute(string query)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = connection.CreateCommand();
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            // ...

            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }

    public void Dispose()
    {            
    }
}
4

4 に答える 4

3

この質問に答える本当の方法はありません。簡潔で標準的な答えは、接続は作業単位の存続期間中存続する必要があるということです。がどのように使用されているかを知る方法DataAccessがないため (アプリケーションの存続期間中存在するのか、それともインスタンス化して何かを行うたびに破棄するのか)、具体的な答えを出すことは不可能です。

そうは言っても、最初のパターンをお勧めしますがDataAccess、必要に応じてオブジェクトをインスタンス化して破棄します。必要以上に長く保管しないでください。

于 2010-07-31T16:00:27.373 に答える
1

で行くことを提案しDataAccess2ます。個人的な好みですが。あなたのクラスが であることを示唆する人さえいるかもしれませんstatic。一方が他方よりもパフォーマンスが高いとは言い難いでしょう。あなたは の道を進んでいますIDisposable。それはすばらしいことです。

あなたの質問で上に示した両方のスタイルを読み、維持していただければ幸いです。

コンストラクターで値を渡すことを排他的に許可するのではなく、DAL が .config からも接続文字列を読み取れるようにすることを検討してください。

public DataAccess2(string connStr)
{
    this.connectionString = connStr;
}
public DataAccess2()
{
    this.connectionString = 
            ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
}

SqlCommand も a でラップすることを検討してくださいusing

using (var conn = new SqlConnection(connectionString))
{
    using(var cmd = conn.CreateCommand())
    {

    }
}
于 2010-07-31T16:17:19.717 に答える
0

1 つ目は、同時呼び出しを行うとエラーになります。2 つ目は、コマンドごとにクリーンな接続を使用することを保証し、より多くの接続が行われるようにします。

使用するシナリオに依存するという上記のステートメントに同意します。最初に関連する問題を克服するために、そのようなパターンを使用する必要があるラッパーがあるため、コマンドが実行されていることを示すためにフィールド値ブール値を設定しますすでに接続されている場合は、実行のために次のコマンドを「キューに入れます」。

もちろん、複数の接続を使用することを好む状況もあります...

于 2010-07-31T16:25:08.987 に答える
0

DataAccess オブジェクトの使用方法に依存すると思います。「using」句内で使用されている場合、接続は完了後に破棄されることが保証されます。

ただし、SQL 接続は Execute メソッド内で作成および破棄されるため、DataAccess オブジェクトを破棄するのを忘れたときに開いたままになる可能性が低いため、一般的には 2 番目のパターンを好みます。

SQL接続が希少なリソースになる可能性があることを考えると、それらが無駄にならないようにあらゆる試みを行う必要があると思います.

于 2010-07-31T16:16:11.220 に答える