c# - 在处理下一个查询之前批处理数据库结果
问题描述
代码在最后一个结果集被处理之前执行:
var rxQueryTimeOut = pollingPeriodInSeconds + dbQueryTimeoutInSeconds;
var scheduler = new EventLoopScheduler(ts => new Thread(ts) {Name = "DatabasePoller"});
query = Observable.Interval(rxQueryTimeOut, scheduler).ObserveOn(SynchronizationContext.Current)
.Select(_ => dbQuery.LoadItemsFromDB(LastFetchedRecord)).Do((x) => DoSomething(x, itemsMgr))
.Retry() //Loop on errors
.Repeat(); //Loop on success
query.Subscribe();
private void DoSomething(List<ItemDBData> theoDataDbs, IItemsMgr itemsMgr)
{
foreach(var theoData in theoDataDbs)
{
}
}
在DoSomething
完成执行之前,Observable.Interval
再次触发。
我试过了:
private void DoSomething(List<ItemDBData> items, IItemsMgr itemsMgr)
{
if(items.Count> 0)
LastFetchedRecord = items[items.Count-1].TimeStamp;
foreach(var itemData in items)
{
}
}
但我认为每个间隔都会丢弃最后一个查询请求,因为我正在丢失数据。我该如何解决这个问题?
解决方案
您是否尝试每 X 秒处理一次数据库表中的新行?
如果在计时器用完之前无法处理一次查询中的所有行,它将丢失数据。
没有更多细节,很难看出问题所在。
考虑查看在处理数据库查询返回的行时完成了多少阻塞操作。一个常见的问题是取回大量行,然后对它们进行 foreach 循环,并为每一行数据执行一次或多次数据库往返。
推荐阅读
- python - 使用while循环在python中复制数据行
- javascript - 如何使用javascript函数getTotal在一个html页面中使用多个函数
- vba - 如何使用 VBA 更改 Access 超链接?
- c# - 用 [SerializeField] 注释的变量未显示在检查器中
- swift - 有没有办法让一个按钮在 SwiftUI 中运行多个功能?
- asp.net - 在不使用母版页的 WebForms VB.NET 项目中添加 AntiForgeryToken
- ssl - Error reading Kafka SSL client truststore file from Spark streaming
- c# - 在类构造函数中使用泛型类型
- ruby-on-rails - act_as_list 将记录放在数组范围的错误位置
- jquery - 如果对象是函数,则jquery扩展函数