.NET Core不会关闭我的MySqlConnection

时间:2017-06-20 14:33:06

标签: c# azure .net-core cleardb mysqlconnection

我有一个使用MySqlConnection类的.NET Core程序。我的数据库是存储在Azure中的ClearDB数据库。

当我启动程序时,它的工作方式应该如此。但是当我等待10个minuts无所事事时,它将不再连接到数据库(Timeout?)。重新启动程序,它再次工作。

在查看ClearDB网页上的连接时,当我在我的程序中关闭它时,它不会关闭。经过10分钟左右,它会自动关闭,正如我在ClearDB网页上看到的那样。但是程序仍在运行,它将不再连接到数据库。重启程序只是解决方案。

现在的代码看起来像这样:

private static async Task<uint> getDeviceId(string macAddress)
{
    using (var connection = new MySqlConnection(ConnectionString))
    {
        uint returnvalue = 0;
        var cmd = connection.CreateCommand() as MySqlCommand;
        cmd.CommandText = @"SELECT id FROM devices WHERE mac = '" + macAddress + "'";
        connection.Open();
        Console.WriteLine(connection.State);

        DbDataReader reader = await cmd.ExecuteReaderAsync();
        using (reader)
        {
            while (await reader.ReadAsync())
            {
                returnvalue = await reader.GetFieldValueAsync<uint>(0);
            }
        }
        reader.Dispose();
        cmd.Dispose();
        return returnvalue;
    }
}

我尝试了以下内容:

  • 使用声明
  • 关闭/处置连接,阅读器和命令
  • 连接字符串中的Pooling = false

但它们都不起作用。有人有个主意吗?

2 个答案:

答案 0 :(得分:0)

假设MySql提供程序与MSSQL提供程序类似,它实际上并不关闭数据库中的连接,它只是将其释放回池中。

你不想禁用池,你会杀死效率。

这是设计和你想要的。

答案 1 :(得分:0)

代码段中的using语句应该关闭您的连接。但是,我不确定它与async的交互方式,以及ClearDB与普通MySql的区别。鉴于问题中的问题和缺乏明确性,您可以尝试这一点,只是为了看看它是否有帮助:

private static async Task<uint> getDeviceId(string macAddress)
{
    uint returnvalue = 0;
    MySqlConnection connection;
    try
    {
        connection = new MySqlConnection(ConnectionString);

        var cmd = connection.CreateCommand() as MySqlCommand;
        //Don't EVER(!) use string concatenation like that in a query!
        cmd.CommandText = @"SELECT id FROM devices WHERE mac = @macAddress";
        cmd.Parameters.Add("@macAddress", MySqlDbType.VarChar, 18).Value = macAddress;
        connection.Open();
        Console.WriteLine(connection.State);

        DbDataReader reader = await cmd.ExecuteReaderAsync();
        using (reader)
        {
            while (await reader.ReadAsync())
            {
                returnvalue = await reader.GetFieldValueAsync<uint>(0);
            }
        }
        reader.Dispose();
        cmd.Dispose();

    }
    finally
    {
        connection.Close();
        connection.Dispose();
    }
    return returnvalue;
}

using块基本上只是将您的代码重写为try/finally,因此,手动执行此步骤有时可以使调试更容易(您可以记录它到达.Close()的位置呼叫)。

如果这确实解决了问题,我不会就此止步,而是从那里开始,看看你能得到的“普通”代码有多接近。我还担心你已经禁用了连接池,并且这个方法是静态的。