所以,我正试图从数据库中出现数据。我目前正在通过使用选择查询执行每秒的计时器来实现此目的,该查询获得所需信息。但通过这样做,它使程序每秒都变得非常困难,所以它看起来非常糟糕。
我的问题是,一旦数据库更新,是否有更好的方法来获取数据?或者有没有更好的方法来优化我这样做的方式,所以它不会每秒创建一次滞后?
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();
}
}
答案 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服务器创建套接字呼叫。不需要计时器。