【问题标题】:How can I reduce the MySQL connection delay in while loop?如何减少while循环中的MySQL连接延迟?
【发布时间】:2012-12-22 23:43:39
【问题描述】:

我有一个从 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();
            }
        }
    }

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

【问题讨论】:

  • 你真正想做什么......我只是因为你的循环而问。MoveNext();不知道你在做什么是否有意义..
  • 我打错了那部分。我已经纠正了这个问题。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这可行。你知道有什么可以指导我参考的参考资料吗?
  • 还请记住,您的客户端在循环之间等待一秒钟,因此至少每秒有 1 台服务器更新数据优于所有客户端。我会添加一些链接。
  • 如果你使用 C#,那么最新的 web api 技术是 asp.net mvc web api:asp.net/web-api
  • 如果它是真正实时的,那么套接字应用程序和/或两种方式的通信通过让服务器回调客户端的变化来避免查询:msdn.microsoft.com/en-us/library/ms752264.aspx
  • 谢谢。这将大大有助于改进应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多