web-dev-qa-db-ja.com

PostgreSQLカーソルは接続にバインドされていますか?

PostgreSQLのカーソルでポイントを確認したいです。

巨大な結果セットクエリ(軽量の行の1Go以上)の選択ファクトリを実装する必要があります。したがって、私はカーソルについて学び、クエリを次のように実行します。

カーソルを作成します。

DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;

少量の結果セットを繰り返しフェッチします。

FETCH 1000 FROM HashedCursorName;

結果セットがなくなったら、カーソルを閉じます。

CLOSE HashedCursorName;

同時実行性に対処する必要があります。つまり、多くのユーザーは、APIプロシージャに格納されている同じクエリを同時に使用できる必要があります。ユーザーがストアドクエリを実行すると、新しい接続を受け取ります。すべての選択クエリがStaticCursorNameと呼ばれる場合、2人のユーザーが同じカーソルを作成したり、同じカーソルを読み取ったりする問題が発生すると考えたため、最初にAPIでカーソル名をマングルしました。すべてが期待どおりに機能します。

次に、カーソル名を静的名に変更しようとしましたが、それでも機能します。複数の同じクエリを同時に実行できます。次に、カーソルは接続にバインドされていますか?、そしてd PostgreSQLはカーソルをセッションに割り当てることによって同時実行性を解決しますか?

2
jlandercy

はい、カーソルはセッション間で共有されず、その名前空間もセッションに対してプライベートです。

さらに、カーソルがWITH HOLD句で「保持可能」と宣言されていない場合、トランザクションの終了時に自動的に閉じられます

カーソルの寿命とセッションの関係については、 CLOSE のドキュメントページで詳しく説明しています。

COMMITまたはROLLBACKによってトランザクションが終了すると、すべての非保持オープンカーソルが暗黙的に閉じられます。保持可能なカーソルは、それを作成したトランザクションがROLLBACKによって中止された場合、暗黙的に閉じられます。作成中のトランザクションが正常にコミットすると、明示的なCLOSEが実行されるか、クライアントが切断するまで、保持可能なカーソルは開いたままになります。

4
Daniel Vérité