如何在数据库更新时有效地从数据库中获取数据
本文关键字:数据库 获取 数据 有效地 更新 | 更新日期: 2023-09-27 18:15:18
所以,我试图从数据库中获取数据,只要它出现在那里。我目前通过让计时器每秒执行一个获取所需信息的选择查询来实现这一点。但是这样做会使程序每秒都很延迟,所以看起来真的很糟糕。
我的问题是,有没有更好的方法在数据库更新时获取数据?或者有没有更好的方法来优化我这样做的方式,使它不会每秒产生延迟?
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();
}
}
使用数据库作为消息传递队列的经验法则。
1)不要使用实际的数据表。使用单独的、专用的快速访问表来保存消息。轮询进程应该能够在毫秒级响应时间内查询此结果。您可以更改其他代码来手动插入/更新队列表,或者在主表上实现一个触发器来更新队列表。关键是要保持队列表的快速和独立于"主"上可能缓慢的事务。
2)如果你的消息不需要在数据库中持久化,可以考虑使用像Redis这样便宜、快速、内存中的数据库来分发消息。
3)或者使用单独的可靠排队机制。有各种各样的框架。我相信MySQL甚至有一个
如果只检查表是否已更新,可以这样做:
SHOW TABLE STATUS like 'tablename';
然后找到update字段:
if (dr.Read())
{
if (dr["Update_time"] != null || dr["Update_time"] != System.DBNull.Value)
{
result = (DateTime) dr["Update_time"];
}
}
将此结果与上次结果进行比较,看看它们是否不同。
不久前我创建了一个聊天程序,遇到了同样的问题。
我的解决方案很不同,但你喜欢与否取决于你。
因为它是相当小的网络,我在哪里实现它,因为工作站已经有一个聊天程序在他们,我使用一个套接字监听器通过UDP和创建一个套接字呼叫从数据库服务器每次db更新。不需要定时器