функция с двойным режимом работы

У меня есть функция, которая должна иметь два режима поведения в зависимости от места, откуда она вызывается.

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

  1. Нормальный режим: всякий раз, когда он вызывается только один раз (вне цикла)

Например:

//...
myfunc(param1, record); // it should insert a single record into the database
//...

  1. Пакетный режим: всякий раз, когда он вызывается из цикла

Например:

    while(...){

myfunc(param1, record);

}

Внутри цикла while каждый раз, когда он вызывается, он должен только сохранять запись в списке, а когда он достигает конца цикла, он должен извлечь все записи из списка и подготовить «пакетный» запрос, который вставляет все в один ход.

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

Любые советы или предложения будут высоко оценены!

Спасибо, куча!

0

Решение

Как правило, невозможно определить, вызывается ли вас в цикле, даже с полным доступом к исходному коду.

Вы можете быть в состоянии сделать что-то с кэшированием и задержкой фактической вставки базы данных на ограниченное время во всех случаях. Продолжайте кэширование до тех пор, пока вы не проведете x микросекунд без нового вызова, а затем вставьте кэшированные данные.

Однако это может дать странные эффекты, если вы не контролируете все обращения к базе данных. В частности, вы должны выполнять кэшированные вставки каждый раз, когда есть запрос, на который они могут повлиять, даже в цикле.

0

Другие решения

Иногда полезно кешировать подобные запросы, чтобы минимизировать количество запросов к базе данных. У вас может быть одна функция, которая создает кэш, и вторая функция, которая отправляет запрос и очищает кэш. Если вы собираетесь это сделать, я рекомендую использовать одну и ту же функцию как для однократной, так и для множественной записи. Псевдокод будет выглядеть примерно так:

Однократное использование:

myfunc(param1, record); # caches requests
sendRequests();         # sends all cached requests, flushes cache

Многократное использование:

while(...){
myfunc(param1, record);
}
sendRequests();

sendRequest () отправит столько запросов, сколько найдет: 1 или много. Для эффективности он может по-разному форматировать запросы в зависимости от их размера.

0

По вопросам рекламы [email protected]