Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Fechar conexão diretamente ou pelo ConnectionFactory

Olá,

Considerando o seguinte:

D) Toda conexão possui o método close, mas o programador não pode chamá-lo, porque a conexão é a mesma para a aplicação inteira.

Não entendi qual a diferença entre fechar a conexão diretamente:

> ConnectionFactory.getConnection().then(connection => connection.close()));

Ou pelo método estático da ConnectionFactory:

static closeConnection(){
           if(connection){
                close(); //onde esse close é = connection.close.bind(connection);
                connection = null;
            }
}

O primeiro fecha a connection (ou seja, ela vira null), enquanto o segundo invoca um método (close) para fechar a connection e também deixa-la null. Eu entendi os efeitos (não podemos chamar connection.close(), somente ConnectionFactory.closeConnection()), mas não entendi as vantagens em se fazer isso.

O instrutor fala em problemas que isso pode acarretar na aplicação. Quais seriam esses problemas?

Obrigado desde já!

5 respostas

Bom dia.

Se você tem uma conexão compartilhada, basta fechar a conexão para bagunçar todos os lugares da sua aplicação que utilizam a conexão. Porque nesses outros lugares você esta confiando que a conexão esta ativa. Nem precisa ir tão longe assim, se um DAO precisar utilizar outro DAO na sequencia e você fecha a conexão no primeiro, bau bau, o segundo DAO não vai funcionar. Então, não faz sentido o programador querer chamar o connection.close(). Porém, como é comum em sistemas de backend o programador fechar a conexão a cada uso, é provável que ele queira fazer isso em nossa aplicação. Matando o connection.close você evita que o programador desavisado feche a conexão. Agora, se ele tem que passar por ConnectionFactory e chamar um de seus métodos estáticos para fechar a conexão, ele, primeiro, tem que saber a existência desse método, pois não é padrão do JavaScript e sabendo sua existência, descobrirá que a conexão é um singleton.

Mas Flávio, os efeitos das duas alternativas não são os mesmos? Nesse exemplo que vc falou, o desenvolvedor não vai conseguir fazer connection.close() e fechar a conexão do primeiro DAO, beleza, mas chamando o closeConnection() ele não estaria fazendo a mesma coisa (fechar a conexão do primeiro DAO e prejudicar o segundo)?

solução!

O efeito é idêntico, como disse, é preciso haver uma forma de fechar a conexão. Agora, se o programador a qualquer momento chamar ConnectionFactory.closeConnection() ele fechará a conexão e se fizer isso no meio vai bagunçar, nada o impede de fazer isso. Mas a chance dele fazer isso é menor porque ele esta acostumado a fechar com connection.close() e se ele tem que procurar algum outro método para fechar a conexão é porque tem algo de especial nisso. E quando ele vê que foi usado o padrão de projeto factory, ele já sabe qual foi a intenção.

Agora, o programador pode fazer o que quiser no código dele, seja inexperiente ou experiente, o que nós programadores que estamos criando funcionalidades para serem usadas por outros programadores é evitar ao máximo que ele cometa alguma besteira, por isso o design e cuidado com a connection.

Em sunma:

conection.close: fecha cada conexão, desabilitado

ConnectioFactory.closeConnection(): fecha uma única conexão, aquela utilizada por toda a aplicação.

São coisas absolutamente diferentes. Existem em JavaScript uma maneira nativa de ter uma única conexão compartilhada? Não, você teve que criar. E se criou, teve que criar uma maneira de fechar também.

Entendi agora perfeitamente, muito obrigado pela paciência e pela resposta, Flávio!

Tranquilo meu aluno. Essas questões de design são enigmáticas mesmo. Sucesso e bom estudo!