c# MySQL Select into Var ->内存增加
本文关键字:内存 增加 Var MySQL Select into | 更新日期: 2023-09-27 17:50:45
我是c#新手,正在尝试从MySQL数据库中读取一个值。
我得到的是一个数字。我将其存储到一个int变量中,并检查特定的数字以激活kuando busylight的函数。
整个过程被循环(try while (true){}和goto方法)。
它工作到目前为止,但我的内存使用正在增加。从~ 6mb开始…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();
}
}
}
}
使用while(true)循环创建多个与数据库的连接。
string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password";
这行可以很容易地从while循环中移出,这应该有助于解决您的问题。
同样,如果这变成了生产代码,您需要在使用数据库时设置参数。参数是我们避免sql注入的方法。
避免SQL注入
希望这对你有所帮助!
您不必处理它,Garbage Collector会自动处理它。但是尽量避免在循环中重新连接到数据库。如果你需要这样做,把MySqlCommand放在循环中,而不是MySqlConnection。
Garbage Collector自动清除未使用的资源。您可以手动运行垃圾收集器,但这是一个非常昂贵的操作,所以不要将它放在while(true)循环中。关于GC的更多信息在这里:http://msdn.microsoft.com/en-us/library/s5zscb2d(v=vs.85).aspx
我看到你正在做的一件事是你没有处理MySqlCommand对象,那将不断建立和占用资源。您需要正确地处置该对象,无论是通过using语句还是调用该对象的处置方法。另外,如果你要不断地轮询数据库,我会在for循环之外启动mysql连接。我也会把一些尝试捕获逻辑到那里,以及捕获DB连接错误。我是这样处理的
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();
}
}