【发布时间】:2011-02-11 15:59:31
【问题描述】:
我有 2 个应用程序,一个是与用户交互的 ASP.NET 站点,另一个是用于调度作业执行的 C# 应用程序。我在 C# 应用程序中的更改跟踪方面遇到了问题,因此它可以响应用户对数据库的更新。基本思路是这样的:
用户通过 ASP.NET 网站向 Products 数据库添加新行。然后应该通知 C# 应用程序有新的行,它会产生一个 Quartz.NET 作业来处理这个新创建的产品。如果更新了产品详细信息,则会通知 C# 应用程序并相应地更新 Quartz.NET 作业。
伪代码:
while(true) // it's not really a loop like this, but this suffices
{
var newProducts = from p in dc.Products where Added_On > DateTime.Now;
foreach(Product product in newProducts)
CreateNewJob(product);
}
然后,每个作业都需要跟踪对其各个列的更改:
void Execute(...)
{
var product = from p in dc.Products where Id == this._product.Id;
if (CompareProduct(this._product, product) == false)
_product = product;
// do work with the product
}
或带有时间戳:
void Execute(...)
{
var updated = from p in dc.Products where Id == _product.Id && Updated_On > DateTime.Now;
if (updated != null)
_product = updated;
}
由于产品通常不会发生变化,有没有比每次执行时都查询更改更好的解决方案?
要求是,如果数据已更改,Quartz.NET 作业不应使用陈旧数据执行。在 Execute() 的开头,它应该是最近的更改。但是,如果在执行过程中状态发生变化,那也没关系。
我查看了 SqlDependency,但我读到的所有内容都说它并没有告诉你发生了什么变化,只是告诉你发生了什么变化。大型数据库不断拉下全表,自己做对比,似乎是行不通的。
更改跟踪似乎也可能效率低下。我必须拉下所有更改,找到与更改项对应的 Quartz.NET 作业,并使用最新数据对其进行更新。
【问题讨论】:
标签: c# sql-server quartz.net