实体框架核心连接管理

时间:2020-04-26 10:51:10

标签: c# entity-framework entity-framework-core

我正在运行一个使用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(Nullable 1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 507
at MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(Nullable
3操作,Func`3 verifySucceeded) 在Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.OpenConnection(DatabaseFacade databaseFacade) 在/****/CounterOperations.cs:第46行中的***。IncrementByAsync(String id,Int32 incrBy,String counterType)

我的数据库连接字符串将并发连接的数量限制为一定数量。我想在某个时候,所有可选连接都已使用,并且连接时间异常。

由于我使用的是EF连接池,因此我希望重用该池中的连接。令人惊讶的是,每次对该函数的调用都打开了一个新的连接。这是我接到每个电话的照片:

连接状态为“已关闭”。开启

这意味着每次我输入此代码时都会打开一个连接。

这里一定是某种错误的代码,否则,我没有遇到那些连接问题。但是我做错了什么?如何管理我的数据库连接?

更新1

根据@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

此更改之后,我仍然可以看到相同的行为(“连接超时”异常)。我还应该检查什么?

0 个答案:

没有答案