我在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(
)方法是静态的并且为每次调用返回一个新实例是否有任何缺点?
答案 0 :(得分:6)
您正在处置中创建新连接?那不行!使用一个超过100次迭代的简单循环(默认最大池大小为100),您可能会看到某种异常(太多开放连接,ExecuteReader requires an open and available Connection等)。
在任何情况下,我都会遇到严重的性能问题,因为池需要连续创建新的物理连接。
我不会重新发明Connection-Pool。我的建议是:不要在asp.net中使用那个类。
Don't poach on the Connection-Pool's territory; - )
但请注意,您可以使用否来回答您的两个问题。静态方法不是问题(与静态连接不同),也不是它总是返回一个新连接(因为池将返回当前未使用的连接)。但是,您的课程的主要问题是dispose
,它会创建连接并打开它们。