Stai archiviando un'origine dati univoca (e connessione e dbMainConnection) in un statico variabile della tua classe Ogni volta che qualcuno chiede un'origine dati, sostituisci quella precedente con quella nuova. Se si verifica un'eccezione durante il recupero di un'origine dati da JNDI, l'origine dati statica rimane così com'è. Non dovresti memorizzare nulla in una variabile statica. Poiché la tua classe dbMainConnection è costruita con il nome di un database e ci sono diversi nomi di database, non ha senso farne un singleton.
Basta usare il codice seguente per accedere all'origine dati:
public final class DataSourceUtil {
/**
* Private constructor to prevent unnecessary instantiations
*/
private DataSourceUtil() {
}
public static DataSource getDataSource(String name) {
try {
Context ctx = new InitialContext();
String database = "jdbc/" + name;
return (javax.sql.DataSource) ctx.lookup (database);
}
catch (NamingException e) {
throw new IllegalStateException("Error accessing JNDI and getting the database named " + name);
}
}
}
E lascia che i chiamanti ottengano una connessione dall'origine dati e la chiudano quando hanno finito di usarla.