如何在while循环中减少MySQL连接延迟?

时间:2012-12-22 23:43:40

标签: c# asp.net mysql database console-application

我有一个接口,可以从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();
            }
        }
    }

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

1 个答案:

答案 0 :(得分:1)

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

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

当然,如果许多客户端正在访问要共享的相同数据,或者可以在内存中保存可缓存的数据集,那么这只是有意义的。它还取决于数据何时可以确定何时必须从缓存或更新中逐出数据。

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

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