Gostaria de confirmar um ponto com o cursor do PostgreSQL.
Eu tenho que implementar uma fábrica de seleção para uma consulta de conjunto de resultados enorme (mais de 1 Go de linhas de peso pequeno). Assim, aprendi sobre o cursor e executo minha consulta da seguinte maneira:
Eu crio um cursor:
DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;
Eu busco repetidamente uma pequena quantidade de conjunto de resultados:
FETCH 1000 FROM HashedCursorName;
Quando o conjunto de resultados está esgotado, fecho o cursor:
CLOSE HashedCursorName;
Eu preciso abordar a simultaneidade, ou seja, muitos usuários devem ser capazes de usar a mesma consulta armazenada no procedimento da API simultaneamente. Quando um usuário executa uma consulta armazenada, ele recebe uma nova conexão. Primeiro, estraguei o nome do meu cursor na API porque pensei que, se todas as consultas selecionadas fossem chamadas StaticCursorName
, eu teria um problema com dois usuários tentando criar o mesmo cursor ou lendo o mesmo. Tudo funciona como esperado.
Em seguida, tentei alterar o nome do cursor para um nome estático e ainda funciona. Eu sou capaz de executar várias consultas simultaneamente. Então eu me pergunto, o cursor está vinculado à conexão? , e então o PostgreSQL resolve a simultaneidade atribuindo o cursor à sessão?
Sim, os cursores não são compartilhados entre sessões e seu namespace também é privado para sua sessão.
Além disso, se o cursor não for declarado "holdable" através da
WITH HOLD
cláusula, ele é automaticamente fechado ao final da transação .A relação entre a vida útil do cursor e a sessão é detalhada na página de documentação para
CLOSE
: