3

ASP.NETWebFormsソリューションでdapperを使用しています。

データを処理するすべてのクラスは、この基本クラスから開いている接続を取得します

public abstract class SalesDb : IDisposable
{
    protected static IDbConnection OpenConnection()
    {
        IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SalesDb"].ConnectionString);
        connection.Open();
        return connection;
    }

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

この基本クラスを使用するサービスクラスの例

public class LeadService : SalesDb
{
    public IEnumerable<LeadDto> Select()
    {
        using (IDbConnection connection = OpenConnection())
        {
            return connection.Query<LeadDto>("Lead_Select",
                null, null, true, null, CommandType.StoredProcedure);
        }
    }
}

OpenConnection(基本クラスの)メソッドが静的であり、呼び出しごとに新しいインスタンスを返すという欠点はありますか?

4

1 に答える 1

7

disposeで新しい接続を作成していますか?それはうまくいきません!100回を超える反復(最大プールサイズのデフォルトは100)の単純なループを使用すると、おそらく何らかの例外が発生します(開いている接続が多すぎるExecuteReaderには開いている使用可能な接続が必要など)。

いずれにせよ、プールは新しい物理接続を連続して作成する必要があるため、深刻なパフォーマンスの問題が予想されます。

私は接続プールを再発明しません。私のアドバイスは次のとおりです。asp.netでは、そのクラスを使用しないでください。

接続プールの領土を密猟しないでください;-)

ただし、どちらの質問にも「いいえ」で答えることができることに注意してください。静的メソッドは(静的接続とは異なり)問題ではなく、常に新しい接続を返すこともありません(プールは現在使用されていない接続を返すため)。しかし、クラスの主な問題は、dispose接続を作成して開くことです。

于 2012-12-25T23:20:29.827 に答える