如何在数据库更新后立即有效地从数据库中获取数据?

时间:2014-07-27 16:30:25

标签: c# mysql

所以,我正试图从数据库中出现数据。我目前正在通过使用选择查询执行每秒的计时器来实现此目的,该查询获得所需信息。但通过这样做,它使程序每秒都变得非常困难,所以它看起来非常糟糕。

我的问题是,一旦数据库更新,是否有更好的方法来获取数据?或者有没有更好的方法来优化我这样做的方式,所以它不会每秒创建一次滞后?

private void updateTimer_Tick(object sender, EventArgs e)
{
    string mySqlConnection = "<connection_string>"; //left out for security purposes
    MySqlConnection connection = new MySqlConnection(mySqlConnection);

    List<String> id = new List<String>();
    List<String> source = new List<String>();
    List<String> message = new List<String>();

    using (connection)
    {
        connection.Open();

        MySqlCommand command = connection.CreateCommand();

        command.CommandText = "SELECT id, source, message FROM Table WHERE target = @address";
        command.Parameters.AddWithValue("@address", ipAddress);

        MySqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            id.Add(reader.GetString(0));
            source.Add(reader.GetString(1));
            message.Add(reader.GetString(2));
        }

        command.Parameters.Clear();

        connection.Close();
    }
}

3 个答案:

答案 0 :(得分:1)

将数据库用作消息队列的经验法则。

1)不要使用实际的数据表。使用单独的专用快速访问表来保存消息。轮询过程应该能够以毫秒响应时间查询。您可以更改其他代码以手动插入/更新队列表,也可以在主表上实现触发器以更新队列表。关键是要保持队列表的快速性,并且与#34; master&#34;上的潜在慢速事务无关。

2)如果不要求您的消息在数据库中持久存在,请考虑使用廉价,快速的内存数据库(如Redis)来分发消息。

3)或使用单独的可靠排队机制。那里有各种各样的框架。我相信MySQL甚至还有一个。

答案 1 :(得分:0)

要仅检查表格是否已更新,您可以执行以下操作:

SHOW TABLE STATUS like 'tablename';

然后你必须找到更新字段:

if (dr.Read()) 
{ 
  if (dr["Update_time"] != null || dr["Update_time"] != System.DBNull.Value)
  { 
    result = (DateTime) dr["Update_time"]; 
  } 
}

将此与您最后得出的结果进行比较,看它们是否不同。

这应该在数据库和应用程序上不那么密集。

答案 2 :(得分:0)

我不久前创建了一个聊天程序,面对同样的问题。

我的解决方案有很大的不同,但如果您愿意的话,这取决于您。

由于它是我实现它的相当小的网络,并且由于工作站中已经有一个聊天程序,我通过UDP为客户端使用套接字监听器,并在每次更新db时从db服务器创建套接字呼叫。不需要计时器。