我有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作业,并使用最新数据更新它。
答案 0 :(得分:1)
可能最好的方法是以旧的方式执行此操作 - 使用sql TIMESTAMP列自行执行更改跟踪。那么你的调度程序只需要获取TIMESTAMP为>的行。 [上次运行TIMESTAMP]进行安排。在安排时,它可以检查行以查看TIMESTAMP是否已更改并在运行之前获取新数据。
现在,如果你有多个表需要担心,这会变得有点复杂。