web-dev-qa-db-fra.com

Le curseur PostgreSQL est-il lié à la connexion?

Je voudrais confirmer un point avec le curseur PostgreSQL.

Je dois implémenter une usine de sélection pour une énorme requête de jeu de résultats (plus de 1Go de lignes de faible poids). Ainsi, j'ai appris au curseur et j'exécute ma requête de la manière suivante:

Je crée un curseur:

DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;

Je félis de manière répétitive une petite quantité de résultatsset:

FETCH 1000 FROM HashedCursorName;

Lorsque les Resulatset sont épuisés, je ferme le curseur:

CLOSE HashedCursorName;

Je dois dire que beaucoup d'utilisateurs doivent être en mesure d'utiliser simultanément la même requête stockée dans la procédure API. Lorsqu'un utilisateur exécute une requête stockée, il reçoit une nouvelle connexion. J'ai d'abord mangé mon nom de curseur dans API parce que je pensais que si toutes les requêtes SELECT sont appelées StaticCursorName, je voudrais un problème avec deux utilisateurs tentant de créer le même curseur ou de lire la même chose. Tout fonctionne comme prévu.

Ensuite, j'ai essayé de changer le nom du curseur sur un nom statique et ça marche toujours. Je suis capable de courir plusieurs questions simultanément. Ensuite, je me demande, le curseur est-il lié à la connexion?, puis d OES PostgreSQL résoudre la concurrence en attribuant un curseur à la session?

2
jlandercy

Oui, les curseurs ne sont pas partagés entre les sessions et leur espace de noms est également privé à leur séance.

De plus, si le curseur n'est pas déclaré "achable" au four à creuser le WITH HOLD Clause, il est automatiquement fermé à la fin de la transaction.

La relation entre la durée de vie du curseur et la session est détaillée dans le docpage pour CLOSE :

Chaque curseur ouvert non exploitable est implicitement fermé lors de la résiliation d'une transaction par commit ou par retour. Un curseur exploitable est implicitement fermé si la transaction qui l'a créée aborde via Rollback. Si la transaction créatrice s'engage avec succès, le curseur exploitable reste ouvert jusqu'à ce qu'une fermeture explicite soit exécutée, ou le client déconnecte.

4
Daniel Vérité