"Fila de requisições" em uma mesma connection

3 respostas
K

O cenário é Servlet + JDBC + pool de conexões sem nenhuma camada Hibernate ou similar - JDBC puro.

1 - Um processo A solicita uma connection ao pool, abre um Statement/ResultSet e devolve a connection ao pool.  Vale observar que o Statement/ResultSet continua aberto, em uso;

2 - Um processo B solicita uma connection ao pool e recebe a mesma connection do processo A. O processo B executa um procedimento demorado no banco de dados utilizando a connection recebida;

OBS: Situação simples, sem concorrência. Os dados tratados por B não possuem nenhuma relação com A.

3 - O processo A solicita uma atualização do ResultSet.

Dúvidas:
A atualização do “processo A” terá de esperar o término da execução do “processo B”?
Pode ocorrer algum tipo de erro em “A” ou “B” simplesmente pelo fato de “enfileirar” requisições?
Se ocorrer algum erro na solicitação do “processo B” a requisição do “processo A” seria afetada?

A idéia de connections “reservadas” para processos demorados é absurda? Ou mesmo o contrário, connections reservadas para procedimentos “rápidos”? Basicamente seria ter mais de um pool de conexões e usar conforme o caso.

Sendo iniciante a simulação do ambiente acima iria demandar muito tempo de preparação e não teria certeza de ter simulado apropriadamente. Imagino que já existam respostas para o acima.

Agradeço também por dicas de “palavras” ou termos para pesquisar sobre o assunto.

3 Respostas

fantomas

Oi kako,

Se não me engano o negócio é o seguinte:

Quando um processo obtem uma conexão no pool ele só devolve quando toda a transação for completada mesmo que tenho ocorrido uma falha. No caso de falha o programador tem que ter o cuidado de detectar a falha e garantir que a conexão seja devolvida.
Se houver um outro processo com inicio ANTES de um outro processo ACABAR o pool de conexões irá disponibilizar OUTRA conexão para este processo e assim sucessivamente.

Os Statements / ResultSets estão diretamente associados as conexões, tanto é que se vc fechar uma conexão automaticamente vc irá fechar os Statements e os ResultSets; logo, não deve haver uma situação onde vc "para" de utilizar uma conexão e fica utilizando apenas os statements e resultsets.

Espero ter conseguido lhe ajudar.

flws

K

Eu imaginava um fluxo da seguinte maneira:

  • Solicitar conexão ao pool;
  • Abrir Statement/ResultSet;
  • Devolver conexão ao pool;
  • Processo… processo … processo …;
  • Atualizar Resultset;
  • Fechar Statement/ResultSet;

Então o fluxo deve ser:

  • Solicitar conexão ao pool;
  • Abrir Statement/ResultSet;
  • Fechar Statement/ResultSet;
  • Devolver conexão ao pool;
  • Processo… processo … processo …;
  • Solicitar conexão ao pool;
  • Abrir Statement/ResultSet;
  • Atualizar Resultset;
  • Fechar Statement/ResultSet;
  • Devolver conexão ao pool;

É isso?

fantomas

kako:
Então o fluxo deve ser:

  • Solicitar conexão ao pool;
  • Abrir Statement/ResultSet;
  • Fechar Statement/ResultSet;
  • Devolver conexão ao pool;
  • Processo… processo … processo …;
  • Solicitar conexão ao pool;
  • Abrir Statement/ResultSet;
  • Atualizar Resultset;
  • Fechar Statement/ResultSet;
  • Devolver conexão ao pool;

É isso?

Esta idéia que vc descreveu é a mais correta na minha opinião. Só não entendi muito bem o que vc quiz dizer com “- Processo… processo … processo …;” mas blz.
Abaixo vou dar uma alteradinha no que vc fêz para ver se melhora mais um pouquinho:

  • Ao iniciar um processo (Alterar a senha de um usuário por ex.) Solicitar conexão ao pool;

  • Abrir Statement/ResultSet;
    [b]- Executar comando de atualização (update neste caso)

  • Executar finalização de todas as execuções durante a transação (commit).
    [/b]- Atualizar Resultset; <---------------- provavelmente o commit foi executado aqui.

  • Fechar Statement/ResultSet;

  • Devolver conexão ao pool;

  • Ao iniciar outro processo (Excluir endereço alternativo por ex.) Solicitar conexão ao pool;

  • Abrir Statement/ResultSet;
    [b]- Executar comando de atualização (delete neste caso)

  • Executar finalização de todas as execuções durante a transação (commit).[/b]

  • Atualizar Resultset; <---------------- provavelmente o commit foi executado aqui.

  • Fechar Statement/ResultSet;

  • Devolver conexão ao pool;

flws

Criado 15 de maio de 2011
Ultima resposta 17 de mai. de 2011
Respostas 3
Participantes 2