0

在关闭数据库连接之前关闭 lua 脚本中所有打开的游标的正确模式是什么?我有一个辅助函数 rows(),它在多个创建游标的地方被调用,在函数 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
4

1 回答 1

2

返回的迭代器函数rows()在到达结果集末尾之前不会关闭游标。也许迭代器的一些实例没有完全读取它们的结果。您可以尝试collectgarbage('collect')在关闭连接之前调用以清理任何未引用的迭代器函数。该rows()函数还可以将所有游标放在具有弱引用的表中,并且该end()函数可以枚举这些关闭任何打开的游标。

于 2010-07-22T16:13:46.530 回答