我需要一些帮助来更好地了解Dapper如何处理数据库连接,以及为什么数据库连接没有得到妥善处理。我编写了不同的可能案例。在我的代码中,我正在检查_connection是否为null,并相应地创建一个新连接。在继续请求时,我发现有时连接处于打开状态,有时我发现对象中缺少连接字符串(使其无法使用,但未将其设置为NULL)。我正在相应地处理这些情况,但是想了解为什么连接具有这些不同的状态,并且即使客户端代码明确地实现了使用语句来包装代码,也不会将其处理掉。它是ADO.net对连接的处理,Dapper的副作用还是我的代码问题?
连接管理代码
public class DatabaseContext : IDatabaseContext
{
private readonly string _connectionString;
private DbConnection _connection;
public DatabaseContext(string connectionString)
{
_connectionString = connectionString;
}
public IDbConnection Connection
{
get
{
if (_connection == null)
_connection = new SqlConnection(_connectionString);
if (string.IsNullOrEmpty(_connection.ConnectionString))
_connection.ConnectionString = _connectionString;
if (_connection.State != ConnectionState.Open)
_connection.Open();
return _connection;
}
}
}
客户代码
public IEnumerable<PostSearResults> Search(SearchPostsBy searchPostsBy)
{
DynamicParameters param;
var sql = GetSearchSql(searchPostsBy,out param);//Gets SQL
using (var connection = _databaseContext.Connection)
{
var posts = connection.Query<PostSearResults>(sql, param);
return posts.ToList();
}
}
答案 0 :(得分:2)
我也在Web应用程序中使用Dapper并实现了与您类似的DapperContext,但是我在类上实现了IDispose,如下所示:
#region IDisposable
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (transaction != null)
{ transaction.Dispose(); }
if (cn != null)
{ cn.Dispose(); }
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
我的Dapper版本是打开连接的,如果它在我们打电话时关闭,然后在执行查询后关闭,如果在我打电话时打开连接Dapper只是执行查询并离开连接打开了。
我也使用DI,因此我的DapperContext生命周期由DI容器管理,因此当Web请求上下文结束并销毁时它将被处理掉。我的Dapper存储库如下所示,使用示例方法GetPE
private readonly IDbConnection context;
private readonly DapperContext dapperContext;
public SFRepository(DapperContext dbContext)
{
dapperContext = dbContext;
context = dbContext.Connection;
}
public PEData GetPE(int peID)
{
PEData rec = context.Query<PEData>("SELECT * FROM PEDATA WHERE ID= @ID", new { ID = peID }).FirstOrDefault();
return rec;
}
它非常稳定,我没有任何奇怪的行为。