3

我在我的 ASP.NET WebForms 解决方案中使用了 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 需要打开且可用的连接等)。

无论如何,我预计会出现严重的性能问题,因为池需要连续创建新的物理连接。

我不会重新发明Connection-Pool。我的建议是:不要使用那个类,在 asp.net 中更是如此。

不要在连接池的领土上偷猎;-)

请注意,您的两个问题都可以用No来回答。静态方法不是问题(与静态连接不同),也不是它总是返回一个新连接(因为池将返回当前未使用的连接)。但是您班级的主要问题是dispose创建连接并打开它们。

于 2012-12-25T23:20:29.827 回答