我正在运行一个使用Entity Framework访问我的数据库(MySQL)的C#(v2.2)应用程序。
这是我的代码:
public static async Task<int> IncerementByAsync(string id, int incrBy, string counterType)
{
using (var context = new CacheDbContext())
{
int result = 0;
using (var command = context.Database.GetDbConnection().CreateCommand())
{
if (command.Connection.State != ConnectionState.Open)
{
Console.WriteLine($"Connection staus is {command.Connection.State.ToString()}. Opening");
context.Database.OpenConnection();
}
command.CommandType = CommandType.StoredProcedure;
command.CommandText = $"Counter_increment2";
command.Parameters.Add(new MySqlParameter("_Id", id));
command.Parameters.Add(new MySqlParameter("_CounterType", counterType));
command.Parameters.Add(new MySqlParameter("_IncrBy", incrBy));
command.Parameters[command.Parameters.Add(new MySqlParameter("_NewValue", result))].Direction = ParameterDirection.Output;
await command.ExecuteNonQueryAsync().ConfigureAwait(false);
return (int)command.Parameters[3].Value; // Read output parameter
}
}
}
我正在运行存储过程Counter_increment2
,并从响应中读取OUT
参数。
当我在开发环境上对其进行测试时-它工作正常。在生产环境中对其进行测试时,当进行大量调用时,我会不时收到错误消息:
MySql.Data.MySqlClient.MySqlException(0x80004005):连接超时已过期。
System.OperationCanceledException:操作已取消。
在System.Threading.SemaphoreSlim.Wait(Int32毫秒超时,CancellationToken取消令牌)
在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ Core \ ConnectionPool.cs:line 46
中的MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection,IOBehavior ioBehavior,CancellationToken cancelleToken)中 在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlConnection.cs:line 523
在MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 507
3操作,Func`3 verifySucceeded) 在Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.OpenConnection(DatabaseFacade databaseFacade) 在/****/CounterOperations.cs:第46行中的***。IncrementByAsync(String id,Int32 incrBy,String counterType)
at MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(Nullable
我的数据库连接字符串将并发连接的数量限制为一定数量。我想在某个时候,所有可选连接都已使用,并且连接时间异常。
由于我使用的是EF连接池,因此我希望重用该池中的连接。令人惊讶的是,每次对该函数的调用都打开了一个新的连接。这是我接到每个电话的照片:
连接状态为“已关闭”。开启
这意味着每次我输入此代码时都会打开一个连接。
这里一定是某种错误的代码,否则,我没有遇到那些连接问题。但是我做错了什么?如何管理我的数据库连接?
根据@Ivan的评论,我将代码修改为:
1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 232
at MySql.Data.MySqlClient.MySqlConnection.Open() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 218
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func
此更改之后,我仍然可以看到相同的行为(“连接超时”异常)。我还应该检查什么?