Oi Thiago, muito obrigado pela resposta. Ficou bem mais claro agora. Dei uma refatorada na sua resposta acima para ficar mais claro para outros leitores.
Abs
A ideia do Singleton é que a classe seja estática, mas os métodos não. Assim, toda vez que você precisar acessar algum serviço do banco, você utilize a classe que está em memória. Os métodos não serão estáticos e nem podem ser.
Vou montar um exemplo bem básico abaixo para tomar como base, neste caso, para recuperar uma conexão de um DataSource:
public class DBFactory {
public static DBFactory factory = null;
private DataSource dataSource;
public static DBFactory getInstance() {
if (factory == null)
factory = new DBFactory();
return factory;
}
private DBFactory() {
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource) envCtx.lookup("jdbc/dataSource");
} catch (Exception e) {
Util.logError(e);
}
}
public Connection getConnection() throws Exception {
try {
return (Connection) dataSource.getConnection();
} catch (Exception e) {
Util.logError(e);
throw e;
}
}
}
Criei uma variável factory do tipo DBFactory (nome da classe), esta estática. Assim, essa variável será a que ficará em memória. Quando alguma outra classe precisa dela, chamará o método getInstance(), que retorna um DBFactory .
Note que no getInstance(), caso esteja nula minha variável, ela cria uma instância da classe, e no meu método construtor, eu faço o acesso ao datasource. Assim, toda vez que alguma classe precisar de uma conexão, meu Datasource sempre estará disponível, e a minha instância em memória só retorna uma conexão.
Na minha implementação, só acesso uma vez o datasource, em quem precisar requisita uma conexão.