PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

JDBC:Posso compartilhar uma conexão em um aplicativo multithread e desfrutar de boas transações?


Sim, em geral você precisa criar uma nova conexão para cada thread. Você não tem controle sobre como o sistema operacional divide a execução de threads (apesar de definir suas próprias seções críticas), então você pode inadvertidamente ter vários threads tentando enviar dados por esse canal.

Observe que o mesmo se aplica a qualquer comunicação de rede. Se você tivesse dois threads tentando compartilhar um soquete com uma conexão HTTP, por exemplo.
  • O segmento 1 faz uma solicitação
  • O segmento 2 faz uma solicitação
  • A thread 1 lê bytes do soquete, lendo involuntariamente a resposta da solicitação da thread 2

Se você agrupar todas as suas transações em seções críticas e, portanto, bloquear quaisquer outros encadeamentos para um ciclo de início/confirmação completo, poderá compartilhar uma conexão de banco de dados entre os encadeamentos. Mas eu não faria isso mesmo assim, a menos que você realmente tenha conhecimento inato do protocolo JDBC.

Se a maioria de seus encadeamentos tiver necessidade infrequente de conexões de banco de dados (ou nenhuma necessidade), você poderá designar um encadeamento para fazer seu trabalho com o banco de dados e fazer com que outros encadeamentos enfileirarem suas solicitações para esse encadeamento. Isso reduziria a sobrecarga de tantas conexões. Mas você terá que descobrir como gerenciar conexões por thread em seu ambiente (ou fazer outra pergunta específica sobre isso no StackOverflow).

atualizar: Para responder à sua pergunta no comentário, a maioria das marcas de banco de dados não suporta várias transações simultâneas em uma única conexão (InterBase/Firebird é a única exceção que conheço).

Seria bom ter um objeto de transação separado e poder iniciar e confirmar várias transações por conexão. Mas os fornecedores simplesmente não o suportam.

Da mesma forma, APIs independentes de fornecedor padrão como JDBC e ODBC fazem a mesma suposição, que o estado da transação é meramente uma propriedade do objeto de conexão.