У меня есть функция, которая должна иметь два режима поведения в зависимости от места, откуда она вызывается.
Основная функция заключается в том, чтобы сделать вставку в таблицу в моей базе данных, но это нужно сделать двумя разными способами.
Например:
//...
myfunc(param1, record); // it should insert a single record into the database
//...
Например:
while(...){
myfunc(param1, record);
}
Внутри цикла while каждый раз, когда он вызывается, он должен только сохранять запись в списке, а когда он достигает конца цикла, он должен извлечь все записи из списка и подготовить «пакетный» запрос, который вставляет все в один ход.
Мне интересно, как заставить его обнаруживать, откуда он вызывается, чтобы переключиться в соответствующий режим, а также как определить, что он достиг конца цикла, и с этого момента он должен начать получать записи из списка, подготовить запрос и выполнить его.
Любые советы или предложения будут высоко оценены!
Спасибо, куча!
Как правило, невозможно определить, вызывается ли вас в цикле, даже с полным доступом к исходному коду.
Вы можете быть в состоянии сделать что-то с кэшированием и задержкой фактической вставки базы данных на ограниченное время во всех случаях. Продолжайте кэширование до тех пор, пока вы не проведете x микросекунд без нового вызова, а затем вставьте кэшированные данные.
Однако это может дать странные эффекты, если вы не контролируете все обращения к базе данных. В частности, вы должны выполнять кэшированные вставки каждый раз, когда есть запрос, на который они могут повлиять, даже в цикле.
Иногда полезно кешировать подобные запросы, чтобы минимизировать количество запросов к базе данных. У вас может быть одна функция, которая создает кэш, и вторая функция, которая отправляет запрос и очищает кэш. Если вы собираетесь это сделать, я рекомендую использовать одну и ту же функцию как для однократной, так и для множественной записи. Псевдокод будет выглядеть примерно так:
Однократное использование:
myfunc(param1, record); # caches requests
sendRequests(); # sends all cached requests, flushes cache
Многократное использование:
while(...){
myfunc(param1, record);
}
sendRequests();
sendRequest () отправит столько запросов, сколько найдет: 1 или много. Для эффективности он может по-разному форматировать запросы в зависимости от их размера.