2010-06-26 5 views

risposta

1

Se la classe DB è costruita per connettersi solo a un singolo database, si avranno problemi quando si dispone di uno script che deve connettersi a 2 due database separati. Tuttavia, è possibile creare la classe singleton per accettare più configurazioni del server e quindi gestirle all'interno del singleton.

Altrimenti, progettare una classe di database come un singleton è una pratica che ha molto senso, in quanto è possibile mantenere uno stretto controllo sul numero di connessioni che uno script sta eseguendo in un dato momento.

+0

Quando si ha a che fare con più database, quindi utilizzare il modello di progettazione "Registro di sistema" (che si presenta come un array associativo Singleton), e usare il connessione DSN come chiave di registro. – greg0ire

+0

Il modello di registro è una soluzione orribile. Basta usare un multitono e fornire coppie chiave/valore (dove la chiave è il nome della connessione, ad esempio "connection_1" e il valore è le informazioni di connessione (nome utente/pass, host, nome del database, ecc.) E avere tutte le tue oggetti di connessione memorizzati nel multitono. Gli oggetti del Registro di sistema non hanno spazio in alcun luogo in quanto sono poco più di variabili globali glorificate. – Adrian

+0

@Adrian, sono totalmente d'accordo. L'intero punto di utilizzo di un modello singleton/multiton è evitare, a tutti i costi, la creazione di una seconda connessione db all'interno dello stesso script. Il modello di registro non sembra risolvere nessuno dei problemi presenti qui. –

1

Lo rende difficile eseguire unit test contro di esso e inoltre rende impossibile avere multiplo connessioni al database. Come tutti sappiamo, le variabili globali hanno molti svantaggi e Singletons non fa eccezione, solo che sono una variabile globale più "amichevole".

Ho trovato un buon article e un vecchio SO question pure.

+0

Penso che tu intenda "più connessioni di database" per pagina, vero? – greg0ire

+0

Sì, è vero. Se non si usa Singleton, finisco per avere, con l'applicazione che sto sviluppando, almeno 4 connessioni al database in ogni momento. Mi stavo chiedendo cosa fosse meno problematico ... – Ricardo

+0

@greg: Sì, almeno con un classico 'getInstance()' Singleton. Forse il poster sta cercando qualcosa come un pool di connessione al database? –

1

Non è possibile utilizzare due connessioni al database. Lo vorresti perché:

  • hai due database.
  • si desidera eseguire un'operazione all'interno di una transazione quando un'altra transazione è già in esecuzione sulla connessione al database "corrente".
  • si desidera utilizzare diverse istanze di database finti nella vostra unità mette alla prova