我有一个包含聊天信息的mssql表。它具有计算列,具有数百万行,并由第三方应用程序使用/填充。现在我想使用此表在我的网站上显示聊天记录,并且将来有可能使用signalr发送消息。 我使用sqldependency进行了几次测试,它只能用于我的情况下无法帮助的特定查询(我必须排除计算列,不能按最后一次msg排序,不能设置前100条消息等)
所以我的问题是什么呢?使用每x秒轮询数据库的Web服务?
旁注,我根本没有影响桌子。
答案 0 :(得分:6)
如果您对实际需求有更多了解,我认为您仍然可以使用SqlDependency
。
您用来检测更改的查询不一定与用于获取更改的查询相同。你可以拥有
select id from chat where chatRoomId = 123
作为"检测更改查询"。这只会告诉你"有一条新消息。或者更多。",没有别的。然后,要获取实际的新行,您可以使用复杂的查询:
select
top 100 someComplexColumn, everythingElse
from chat
where chatRoomId = 123
order by messageTime desc
只要"检测更改查询"足以将你不关心的大部分变化与你做关心的变化分开,你很好。请注意,SqlDependency
实际上并未告诉您 更改了什么,或其他任何有关数据的信息。它并不关心有多少数据适合查询现在 - 它只跟踪适合您指定的过滤器的更改。由于聊天消息通常是不可变的,因此您只需检查id
列即可(例如"新项目")。如果您的聊天消息是可编辑的,那么您还必须在您的"检测更改查询"中添加一些changedOn
列。
答案 1 :(得分:2)
SqlDependency
的一个不错的选择是SqlDependencyEx。它没有内存泄漏problems并使用数据库触发器和本机Service Broker通知来接收有关表更改的事件。这是一个用法示例:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
使用SqlDependecyEx
,您可以分别监控INSERT
,DELETE
,UPDATE
,并在事件args对象中接收实际更改的数据(xml
)。过滤传入的消息可帮助您实现所需的行为。希望这有帮助。