0

db接続を閉じる前に、luaスクリプトで開いているすべてのカーソルを閉じる適切なパターンは何ですか? 関数 end() で、カーソルを作成する複数の場所で呼び出されるヘルパー関数 rows() があり、作成されたものをすべて閉じることができるようにしたいと考えています。

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 に答える