我如何减少MySQL连接延迟while循环
本文关键字:延迟 while 循环 连接 MySQL 何减少 | 更新日期: 2023-09-27 17:49:30
我有一个从MySQL数据库提取数据并在控制台窗口中显示数据的接口。用于显示信息的代码使用while循环循环。
我遇到的问题是MySQL连接打开和关闭每个循环,这会导致延迟显示信息。我已经尝试在循环之前打开一个连接,并在循环退出后关闭它,但我得到一个豁免,告诉我连接需要有效和打开。
因此循环将数据库中的数据添加到datalist
List中,然后显示在控制台中。每个循环还清除列表,因为服务器上的信息可能因更新而更改。
我想要远离的另一件事是Thread.Sleep()
,因为它会挂起程序(我知道是设计的),但我不知道其他解决方案。
我的代码;
public void Loop()
{
public static string loopquery;
public static List<DataList> datalist;
var cki = new ConsoleKeyInfo();
do
{
DateTime time = DateTime.Now.AddSeconds(1);
while ((DateTime.Now < time))
{
Console.Clear();
Travel.data.Clear();
loopquery = "SELECT * FROM database)";
Travel();
Console.WriteLine("Hurray it's a loop!");
Console.WriteLine(datalist[0].id);
Console.WriteLine(datalist[0].name);
if (Console.KeyAvailable)
{
// Waits until the user presses a key, and puts it into our object key.
cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.UpArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.DownArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.LeftArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.RightArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.Escape)
{
break;
}
}
else
{
Thread.Sleep(1000);
}
}
} while (cki.Key != ConsoleKey.Escape);
}
public void Travel()
{
//Open a connection
databaseCon.Open();
//Create Command
var cmd = new MySqlCommand(Loop.loopquery, databaseCon);
//Create a data reader and Execute the command
var dataReader = cmd.ExecuteReader();
try
{
//Read the data and store them in the list
while (dataReader.Read())
{
var data= new DataList();
data.id = (dataReader.GetInt32(0));
data.name = (dataReader.GetString(1));
Loop.datalist.Add(data);
}
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex);
Console.ReadLine();
}
finally
{
if (dataReader != null)
{
//close Data Reader
dataReader.Close();
}
if (databaseCon != null)
{
//close Connection
databaseCon.Close();
}
}
}
有更有效的方法吗?我不想用数百个查询来打击服务器,因为这个客户端将被许多人使用。
正如您所指出的,对于许多客户端来说,在一个循环中直接对数据库执行数百次查询可能效率不高。
在你的应用程序上没有具体的细节,但是避免一堆客户端在循环中敲打SQL服务器的一种方法是在客户端和数据库服务器之间添加一个应用程序层。您可以打开API端点(REST等…)供客户端查询。应用层服务器可以定期查询并将数据保存在内存中,供所有客户端查询。
当然,只有当许多客户端访问相同的数据以共享或一组可缓存的数据可以保存在内存中时,这才有意义。它还取决于数据的潜在程度,以确定何时必须从缓存中取出数据或更新数据。
另一种选择是与套接字服务器之类的东西创建双向通信,当数据发生变化时,服务器回调客户端。
如果应用程序层也用于写,那么还有其他选项可以在更改时使缓存中的数据无效