![](/img/trans.png)
[英]C# How do I read data from an SQL Server database as soon as it is inserted?
[英]How do I efficiently get data from a database as soon as it updates?
因此,我试图从数据库中获取数据。 我目前正在通过使计时器每秒执行一次获取所需信息的选择查询来完成此任务。 但是这样做会使程序每秒滞后很长时间,因此看起来真的很糟糕。
我的问题是,是否有更好的方式在数据库更新后立即获取数据? 还是有一种更好的方法来优化我的操作方式,从而不会每秒产生延迟?
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';
然后您必须找到更新字段:
if (dr.Read())
{
if (dr["Update_time"] != null || dr["Update_time"] != System.DBNull.Value)
{
result = (DateTime) dr["Update_time"];
}
}
将此与您最后看到的结果进行比较,看看它们是否不同。
这在数据库和应用程序上应该不那么费劲。
我不久前创建了一个聊天程序,遇到了同样的问题。
我的解决方案截然不同,但是您可以选择由您决定。
由于这是我在上面实现的一个相当小的网络,并且由于工作站中已经有一个聊天程序,因此我每次通过UDP使用套接字侦听器作为客户端,并在每次更新db时从db服务器创建套接字声明。 无需计时器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.