我有一个使用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;
}
}
我尝试了以下内容:
但它们都不起作用。有人有个主意吗?
答案 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()
的位置呼叫)。
如果这确实解决了问题,我不会就此止步,而是从那里开始,看看你能得到的“普通”代码有多接近。我还担心你已经禁用了连接池,并且这个方法是静态的。