我有几个DbContextes连接到同一个应用程序中的同一个数据库。
我注意到EF6有一个新的构造函数:https://msdn.microsoft.com/en-us/library/gg696604(v=vs.113).aspx
我的问题是,让我说我连接我的DI框架为每个请求创建一个SqlConnection,并用这个新的构造函数将其传递给每个DbContexts,这是正确的方法吗?或者是否应该长期使用Sql连接而不是每个请求?
public async Task<SqlConnection> GetOpenedConnectionAsync()
{
_connection = new SqlConnection(_config.AscendDataBaseConnectionString);
await _connection.OpenAsync(_cancel.Token);
return _connection;
}
在每个应用程序生命周期或每个请求生命周期内注册?
答案 0 :(得分:1)
取决于您的用例,但总的来说,我会高度反对Singleton范围。
通常,创建新连接并将其拆除的成本很低,除非服务器和Db之间存在长的数据包延迟(例如移动设备),但是如果服务器接近,则这是&lt; 5毫秒。
如果假设您有1个数据库,由一千个服务器(负载平衡或其他)使用,如果所有这些服务器始终保持打开连接,您可能遇到问题,但如果您有每个打开和关闭连接,并且如果需要,这可能会奏效。
如果您有1个数据库,以及1个或2个服务器,您可以拥有一个连接(为每个请求节省少量时间),但是存在陷阱,我会高度劝阻它,因为:
如果您打开一个事务,那么在该事务完成之前,其他任何查询都无法运行,因为每个连接在任何时候只能有一个事务。例如。用户A尝试列出所有客户(需要5秒),这意味着在您让所有客户都回来之前,其他任何查询都无法运行。
如果一个事务被打开,并且由于它没有提交的任何原因,你将基本上放弃与该数据库的完全连接,直到该事务被回滚/提交,这可能会也可能不会发生。