1

我有一个从 MySQL 数据库中提取数据并将其显示在控制台窗口中的界面。用于显示信息的代码使用 while 循环进行循环。

我遇到的问题是 MySQL 连接在每个循环上打开和关闭,这会导致显示信息的延迟。我曾尝试在循环之前打开一个连接,并在循环退出后关闭它,但我得到一个豁免,告诉我连接需要有效且打开。

所以循环将数据库中的数据添加到datalist列表中,然后显示在控制台中。每个循环还会清除列表,因为服务器上的信息可能会因更新而改变。

我想摆脱的另一件事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();
            }
        }
    }

有没有更有效的方法来做到这一点?我不想用数百个查询来敲击服务器,因为这个客户端将被许多人使用。

4

1 回答 1

1

正如您所指出的,对于许多客户端来说,直接在循环中对数据库执行数百个查询可能效率不高。

您的应用程序没有具体细节,但避免一堆客户端循环冲击 SQL 服务器的一种方法是在客户端和数据库服务器之间添加一个应用程序层。您可以打开 API 端点(REST 等)供客户端查询。应用层服务器可以周期性地查询数据,并将数据保存在内存中,供所有客户端查询。

当然,这只有在许多客户端访问相同的数据以共享或一组可缓存的数据可以保存在内存中时才有意义。它还取决于数据的潜在性,以确定何时必须从缓存中驱逐数据或更新数据。

另一种选择是创建与套接字服务器之类的双向通信,其中服务器在数据更改时回调客户端。

如果应用层也用于写入,那么还有其他选项可以在更改时使缓存中的数据无效。

于 2012-12-23T21:00:33.567 回答