Pergunta

Estou interessado em saber como bancos de dados de lidar com conexões que não são explicitamente fechados pela entidade que iniciou a conexão.

  1. dizer que tenho um banco de dados que pode aceitar apenas 2 conexões simultâneas em um momento. Eu tenho um pedaço de código que abre uma conexão e nunca fecha. Este pedaço de código é executado sempre, mas ele usa a conexão apenas uma vez nele de vida, mas o objeto de conexão nunca sai do escopo, por isso não é lixo coletado. Say I executar 2 instâncias desse código. Isso significa que até que o programa é encerrado ou a conexão expira (devido à inatividade) o banco de dados não pode aceitar mais conexões?

  2. No cenário acima, se o objeto de conexão é lixo coletado, em seguida, é a conexão automaticamente rescindido ou depende do driver de banco de dados que estou usando ou a conexão não é terminada em tudo até eu fechá-lo explicitamente?

  3. Se eu abrir uma conexão no pedaço de código e eu não fechar a conexão explicitamente, mas o termina do programa, em seguida, como é que a recuperação de banco de dados que conexão?

Foi útil?

Solução

O protocolo subjacente para conexões de banco de dados é tipicamente baseado em TCP / IP. A conexão pode ser encerrado em uma das várias maneiras:

  1. O servidor fecha-lo graciosamente e recebe uma confirmação do cliente;
  2. O cliente fecha é graciosamente e recebe uma confirmação do servidor;
  3. Os conexão expira. O cliente eo servidor ambos separadamente são informados por seus respectivos sistemas operacionais que a conexão foi fechada;
  4. A ligação é vigorosamente fechado por qualquer um dos lados.

No caso de (3), as conexões TCP deve ser mantido vivo enviando mensagens falsas de vez em quando para evitar um tempo limite. Sua conexão pode tempo limite, porque nenhum dos lados está fazendo isso (e para uma conexão de banco de dados não é algo que você normalmente quer fazer).

É inteiramente possível para um tempo para um lado para que a conexão é fechada e hte outro lado ainda acreditam que é aberto. As mensagens podem ser mandado nos casos (e normalmente descartados).

Cada conexão ( "socket") usa um recurso do sistema operacional chamado de arquivo descritor (em UNIX linguagem, seu sistema operacional pode chamá-lo de outra coisa), que é um identificador para um recurso I / O ea mesma coisa usada para um arquivo aberto (novamente, OSs podem variar).

O limite de conexões em seu banco de dados será o menor de:

  • O limite configurado para o OS;
  • Os descritores de arquivo máximo permitido para esse processo (menos qualquer sendo usado para atividade de I / O); e
  • (possivelmente) configurações do sistema ou políticas de limites de conexão.

Se a conexão não for TCP base (por exemplo, um sistema de arquivos tomada como é usado frequentemente com MySQL em sistemas UNIX) os princípios são de fato muito simlar.

De qualquer forma, a moral da história para tirar de tudo isto é que uma conexão de banco de dados - independentemente da sua forma - envolve um recurso do sistema operacional de algum tipo. Sua HSA programa direta ou indiretamente pediu para esse recurso. Se o programa morre, o sistema operacional irá recuperá-lo (talvez não imediatamente, mas eventualmente). Se a conexão recebe lixo coletado, em seguida, o recurso será lançado em muito da mesma forma como se tivesse sido fechadas à força.

Seu esse recurso externo (e não o código de seu cliente está usando) que mantém a conexão aberta e unidades quaisquer limites.

Outras dicas

Para responder às suas perguntas em ordem:

  1. Sim, provavelmente. A não ser por "conexões simultâneas" você realmente quer dizer "consultas simultâneas". Se yo're segurando a conexão banco de dados aberto, é aberta.

  2. A coleta de lixo pode ou não limpar a conexão. Depende do idioma e o driver de banco de dados utilizado. (Coleta de lixo pode ser limitada a recuperação de memória, nem recursos como conexões TCP).

  3. Quando seus termina do programa, em geral, o sistema operacional é responsável pela limpeza de todos os recursos que costumava. Isto inclui TCP de fecho, etc. conexões. Assim, para a maioria dos tipos de conexão, o banco de dados será notificado que o outro lado fechou a conexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top