Как закрыть все открытые курсоры в Lua? - PullRequest
0 голосов
/ 22 июля 2010

Каков правильный шаблон для закрытия всех открытых курсоров в сценарии lua перед закрытием соединения с БД?У меня есть вспомогательная функция row (), которая вызывается в нескольких местах, которая создает курсоры, в функции end () я хочу иметь возможность закрыть все, что было создано.

function rows (sql_statement)
   local cursor = assert (con:execute (sql_statement));
   local closed = false;
   return function ()
     if (closed) then return nil end;
     local row = {};
     result = cursor:fetch(row);
     if (result == nil) then
       cursor:close();
       closed = true;
       return nil;
     end;
     return row;
   end
end

function end() 
   -- this con:close() call fails because of open cursors
   con:close();
   env:close();
end

1 Ответ

2 голосов
/ 22 июля 2010

Функция итератора, возвращаемая rows(), не закрывает курсор, пока не будет достигнут конец набора результатов. Возможно, некоторые экземпляры итератора не полностью прочитали свои результаты. Вы можете попытаться вызвать collectgarbage('collect'), чтобы очистить все функции, на которые нет ссылок, перед тем как закрыть соединение. Функция rows() также может помещать все курсоры в таблицу со слабыми ссылками, а функция end() может перечислять их, закрывая любые открытые курсоры.

...