在 .NET Web 中使用 Dapper 重用数据库连接 API
Reusing database connection with Dapper in .NET Web API
我见过的大多数(如果不是全部的话).NET 中的 Dapper 示例都使用如下结构:
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Query<T>(sql, param);
}
如果您有 Web API ,每次向服务器发出请求时都建立一个新连接是否明智?或者将连接抽象到另一个 class 并将其注入每个控制器以便它们使用相同的连接是更好的模式。
从表面上看,重用连接似乎会导致更快的响应,但我不知道 SqlConnection 对象中发生的事情的本质,所以我不确定这是否是个好主意。
该代码具有误导性。在大多数情况下,您这样做实际上并不是在创建 new 连接。默认情况下 pooling 为连接启用,除非您明确告诉它不要。
我不是 100% 确定池背后的确切标准,但要点是,如果您在代码中快速重复使用相同的连接字符串,池实际上应该只创建一个从您的应用程序到 SQL 服务器,而不是每次 new SqlConnection
并打开它时都创建一个新连接。
通过处理连接,您基本上表示该特定使用已完成....因此维护池背后的逻辑可以知道您已完成该特定连接。同样,我不确切知道池是如何实现的,但我想它在内部跟踪你的代码建立了多少连接,以便它可以决定是否保持与 SQL 服务器的实际连接打开。
有同样的疑问,也是这样实现的。这将被注册为 Transient Service with DI
public class GenericRepository<T> : IGenericRepository<T>, IDisposable where T: class
{
private readonly IDbConnection connection;
public GenericRepository()
{
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"]);
connection.Open();
}
public virtual T QueryFirstOrDefault<T>(string sql, object parameters = null)
{
return connection.QueryFirstOrDefault<T>(sql, parameters);
}
public void Dispose()
{
connection.Close();
connection.Dispose();
}
}
我见过的大多数(如果不是全部的话).NET 中的 Dapper 示例都使用如下结构:
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Query<T>(sql, param);
}
如果您有 Web API ,每次向服务器发出请求时都建立一个新连接是否明智?或者将连接抽象到另一个 class 并将其注入每个控制器以便它们使用相同的连接是更好的模式。
从表面上看,重用连接似乎会导致更快的响应,但我不知道 SqlConnection 对象中发生的事情的本质,所以我不确定这是否是个好主意。
该代码具有误导性。在大多数情况下,您这样做实际上并不是在创建 new 连接。默认情况下 pooling 为连接启用,除非您明确告诉它不要。
我不是 100% 确定池背后的确切标准,但要点是,如果您在代码中快速重复使用相同的连接字符串,池实际上应该只创建一个从您的应用程序到 SQL 服务器,而不是每次 new SqlConnection
并打开它时都创建一个新连接。
通过处理连接,您基本上表示该特定使用已完成....因此维护池背后的逻辑可以知道您已完成该特定连接。同样,我不确切知道池是如何实现的,但我想它在内部跟踪你的代码建立了多少连接,以便它可以决定是否保持与 SQL 服务器的实际连接打开。
有同样的疑问,也是这样实现的。这将被注册为 Transient Service with DI
public class GenericRepository<T> : IGenericRepository<T>, IDisposable where T: class
{
private readonly IDbConnection connection;
public GenericRepository()
{
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"]);
connection.Open();
}
public virtual T QueryFirstOrDefault<T>(string sql, object parameters = null)
{
return connection.QueryFirstOrDefault<T>(sql, parameters);
}
public void Dispose()
{
connection.Close();
connection.Dispose();
}
}