我是C#的新手并试图从MySQL数据库中读取一个值。
我得到的是一个号码。 我将它存储到一个int变量中并检查特定的数字以激活kuando busylight的功能。
整个事情是循环的(尝试while(true){}和goto方法)。
它到目前为止工作,但我的内存使用量正在增加。从〜6 MiB ... 30MiB开始,等等。
不知何故,它将数据保存到进程中,但我没有找到如何清除已用内存。
正如所说的非常非常新的,也许我的代码太糟糕了,无法正常工作以及现在清除未使用数据的问题。告诉我:D
非常感谢!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Plenom.Components.Busylight.Sdk;
using System.Threading;
namespace TANSS4BLL
{
class Program
{
static void Main()
{
var controller = new BusylightUcController();
int resultStatus;
while (true)
{
string sqlDataBaseSelect = "SELECT typID FROM az_manager where maID = 4328 ORDER BY datum DESC LIMIT 1";
string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password";
using (MySqlConnection connDataBase = new MySqlConnection(ConnectionString))
{
connDataBase.Open();
MySqlCommand cmd = new MySqlCommand(sqlDataBaseSelect, connDataBase);
resultStatus = (int)cmd.ExecuteScalar();
if (resultStatus == 1)
{
//Console.WriteLine("Debugtext1");
controller.Light(BusylightColor.Green);
}
else if (resultStatus == 2)
{
//Console.WriteLine("Debugtext2");
controller.Light(BusylightColor.Red);
}
else if (resultStatus == 3)
{
//Console.WriteLine("Debugtext3");
controller.Light(BusylightColor.Red);
}
else if (resultStatus == 9)
{
//Console.WriteLine("Debugtext4");
controller.Light(BusylightColor.Red);
}
connDataBase.Close();
}
//Console.WriteLine(resultStatus);
Thread.Sleep(1000);
//Console.Clear();
}
}
}
}
答案 0 :(得分:0)
您无需处理它,垃圾收集器将自动处理它。但是尽量避免在循环中重新连接到数据库。如果你需要这样做 - 把MySqlCommand放在循环中,而不是MySqlConnection。
垃圾收集器自动清除未使用的资源。您可以手动运行Garbage collector,但操作非常昂贵,所以不要把它放在(true)循环中。有关GC的信息,请访问:http://msdn.microsoft.com/en-us/library/s5zscb2d(v=vs.85).aspx
答案 1 :(得分:0)
我看到你正在做的事情之一就是你没有处理MySqlCommand对象,它会不断构建和占用资源。无论是通过using语句还是在其上调用dispose方法,都需要正确处理该对象。如果你继续轮询数据库,我会启动你在for循环之外的mysql连接。我还会在其中添加一些try catch逻辑来捕获数据库连接错误。以下是我对此的攻击方式,
var controller = new BusylightUcController();
int resultStatus;
string sqlDataBaseSelect = "SELECT typID FROM az_manager where maID = 4328 ORDER BY datum DESC LIMIT 1";
string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password";
using (MySqlConnection connDataBase = new MySqlConnection(ConnectionString))
{
connDataBase.Open();
try
{
while (true)
{
using(MySqlCommand cmd = new MySqlCommand(sqlDataBaseSelect, connDataBase))
{
resultStatus = (int)cmd.ExecuteScalar();
switch(resultStatus)
{
case 1:
//Console.WriteLine("Debugtext1");
controller.Light(BusylightColor.Green);
break;
case 2:
//Console.WriteLine("Debugtext2");
controller.Light(BusylightColor.Red);
break;
case 3:
//Console.WriteLine("Debugtext3");
controller.Light(BusylightColor.Red);
break;
case 9:
//Console.WriteLine("Debugtext4");
controller.Light(BusylightColor.Red);
break;
default:
// handle when its not any of your results.
break;
}
}
//Console.WriteLine(resultStatus);
Thread.Sleep(1000);
//Console.Clear();
}
}catch(Exception ex)
{
//HandleException
}finally
{
connDataBase.Close();
}
}
答案 2 :(得分:0)
您正在使用while(true)循环创建与数据库的多个连接。
string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password";
这一行很容易移出while循环,你可以帮助解决你的问题。
此外,如果这变成生产代码,则需要在使用数据库时设置参数。参数是我们如何避免sql注入。
希望这可以帮助你!