为什么平时Dapper会自动打开这个.NET Core数据库连接,需要手动打开?
Why do I need to manually open this .NET Core database connection when usually Dapper auto opens it?
我正在尝试使用 async/await 将多条记录插入数据库。如果我不手动打开连接,我会得到一个 Exception
。如果我添加一些代码来打开连接,那么一切正常。
这是当前代码(抛出异常):
using (var connection = new SqlConnection(ConnectionString))
{
var tasks = new List<Task>();
soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
await Task.WhenAll(tasks);
}
...
private async Task InsertUrlAsync(IDbConnection connection, string url)
{
const string query = "INSERT INTO ..";
return await connection.ExecuteAsync(query, new { .. });
}
异常:
Message: System.InvalidOperationException : Invalid operation. The connection is closed.
但是当我将代码更改为以下内容时,它起作用了:
var tasks = new List<Task>();
await connection.OpenAsync();
soldUrls.ForEach(....) .. etc ...
类似的 SO 问题:
Dapper 为您打开连接;但它也会在工作完成后关闭它。
现在,您是 运行 使用一个连接的两个独立 async
任务。
soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
两项任务同时运行。当一项任务的工作完成时,它会关闭连接。但是其他任务仍然是 运行,它无法再访问打开的连接,因此出现了您提到的异常。
如您所说,如果您自己打开连接,Dapper 不会关闭它,一切正常。
顺便说一句,在并发使用连接实例时,可能会出现意想不到的问题。详情请参考this问题。
我正在尝试使用 async/await 将多条记录插入数据库。如果我不手动打开连接,我会得到一个 Exception
。如果我添加一些代码来打开连接,那么一切正常。
这是当前代码(抛出异常):
using (var connection = new SqlConnection(ConnectionString))
{
var tasks = new List<Task>();
soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
await Task.WhenAll(tasks);
}
...
private async Task InsertUrlAsync(IDbConnection connection, string url)
{
const string query = "INSERT INTO ..";
return await connection.ExecuteAsync(query, new { .. });
}
异常:
Message: System.InvalidOperationException : Invalid operation. The connection is closed.
但是当我将代码更改为以下内容时,它起作用了:
var tasks = new List<Task>();
await connection.OpenAsync();
soldUrls.ForEach(....) .. etc ...
类似的 SO 问题:
Dapper 为您打开连接;但它也会在工作完成后关闭它。
现在,您是 运行 使用一个连接的两个独立 async
任务。
soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url))); rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
两项任务同时运行。当一项任务的工作完成时,它会关闭连接。但是其他任务仍然是 运行,它无法再访问打开的连接,因此出现了您提到的异常。
如您所说,如果您自己打开连接,Dapper 不会关闭它,一切正常。
顺便说一句,在并发使用连接实例时,可能会出现意想不到的问题。详情请参考this问题。