Você está armazenando uma fonte de dados exclusiva (e conexão e dbMainConnection) em um arquivo estático variável de sua classe. Cada vez que alguém solicita uma fonte de dados, você substitui a anterior pela nova. Se ocorrer uma exceção ao obter uma fonte de dados do JNDI, a fonte de dados estática permanecerá como está. Você não deve armazenar nada em uma variável estática. Como sua classe dbMainConnection é construída com o nome de um banco de dados e existem vários nomes de banco de dados, não faz sentido torná-la um singleton.
Basta usar o seguinte código para acessar a fonte de dados:
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 permita que os chamadores obtenham uma conexão da fonte de dados e a fechem quando terminarem de usá-la.