Пакетная база данных перед обработкой следующего запроса - PullRequest
0 голосов
/ 17 октября 2019

Код выполняется до обработки последнего набора результатов:

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)
    {

    }
}

Но я думаю, что каждый интервал отбрасывает последний запрос, потому что я теряю данные. Как мне это решить?

1 Ответ

0 голосов
/ 17 октября 2019

Пытаетесь ли вы обрабатывать новые строки в таблице базы данных каждые X секунд?

Они потеряют данные, если не смогут обработать все строки в одном запросе до истечения времени таймера.

Без подробностей трудно увидеть проблему.

Рассмотрим, сколько операций блокировки выполнено при обработке строк, возвращаемых запросом к базе данных. Распространенная проблема состоит в том, чтобы получить множество строк назад, а затем цикл foreach для них и выполнить одно или несколько циклов обхода базы данных для каждой строки данных.

...