Tenho estudado design patterns e recentemente vi um exemplo da criação de conexão de banco de dados utilizando o padrão Singleton. Não seria o caso de utilizar esse exemplo para a criação da conexão ao banco?
Tenho estudado design patterns e recentemente vi um exemplo da criação de conexão de banco de dados utilizando o padrão Singleton. Não seria o caso de utilizar esse exemplo para a criação da conexão ao banco?
Oi Maikon, tudo bem? Isso depende bastante. Já vi sim o Singleton sendo utilizando para criação de conexões com o banco, mas existe um problema ai.
Digamos que sua aplicação use de alguma forma o conceito de concorrência, ou seja, duas execuções paralelas, como você controla a questão da conexão? se tiver livre usa, se não tiver, espera, certo? Imagine uma fina de 100.000 queries sendo empilhadas nessa fila.
Imagine que no momento em que o usuário está fazendo login, um outro está mandando gerar um relatório pesadíssimo e demorado. Como você para um para atender o outro?
É por causa dessa variação de contexto que o Singleton pode fazer sentido ou não. Em algum momento, a vantagem do padrão pode se tornar uma limitação.
No que diz respeito a conexões, uma boa prática ao meu ver é o que é mais comum de ser visto nas aplicações Java, onde os gerenciadores (ORMs) ou coisas do tipo criam o que chamamos de pool de conexões. Eu posso usar apenas uma conexão, mas quando for necessário, posso usar 3, 5, até um teto máximo. Tipo 6.
Isso pode gerar outros problemas, mas a ideia é por ai, o contexto da sua aplicação é quem indica mais ou menos o melhor padrão a ser utilizado. Claro, há questões arquiteturais também envolvidas ai.
Deu pra dar uma ideia do por que?
Lembrando que o Factory é para facilitar a criação de objetos tidos como complexos (qualquer objeto). Você pode combinar isso com um Singleton ou não. :)
Uma coisa interessante a se notar é que um Singleton em PHP não é um Singleton pra valer...
Quando um script em PHP é executado, é disparado um novo processo (um php.exe) ou thread (para FastCGI).
Cada processo (ou thread) é isolado do outro. Chega uma requisição, é feito processamento, é gerada a resposta. As variáveis criadas, mesmo as estáticas, morrem depois da resposta.
Num Java da vida, um Singleton vale enquanto a aplicação tiver no ar. Está atrelado à classe carregada na memória, o que é feito só uma vez por aplicação.
Então, em PHP, é um "Singleton por request", digamos. Pra conexões, o Singleton em PHP até que não é tão problema tão grande.
Mas a ideia de pool de conexões é importante. Criar conexões com o BD é lento. Só que em PHP não dá pra implementar exatamente um pool. Existem as conexões persistentes
Puxa, dessa eu não sabia, vou dar uma lida a respeito, valeu mesmo Alexandre.