Pelo que entendi, você tem um método que está chamando ele mesmo. StackOverFlow normalmente é isso.
Acho que instance deve ser declarado como Connection, não como ConnectionDB
public static final MySingleton INSTANCE = new MySingleton();
private MySingleton() {
//private constructor
}
}
[/code][/quote]
Cadê o synchronized para garantir que será thread-safe ? Sem isso, tu não tem garantia alguma que somente uma thread por vez fará acesso ao método. O ideal é utilizar algum pool de conexão disponível, pois o synchronized pode afetar a perfomance, principalmente se houveram muitas consultas ao banco. O famoso “abrir e fechar” conexões, resultsets, preparedstatements podem gerar uma diferença, as vezes considerável, de perfomance.
Seria basicamente algo assim:
class MySingleton {
private static MySingleton instance;
private MySingleton() {
//private constructor
}
public synchronized synchronized MySingleton getInstance() {
if (null == instance)
instance = new MySingleton();
return null;
}
}
Mais ou menos isso. Particularmente, não recomendo a utilização de Singleton, mas se queres apenas a nível de conhecimento, fica o exemplo.
É aí que está o truque: “thread-safe e melhor performance”.
“thread-safe”: A instance é criada pelo Classloader no momento que a classe é carregada. Nenhuma thread ainda teve acesso a isso.
“melhor performance”: Não existe a necessidade de se usar synchronized ou de se verificar se a instance já existe ou não. É garantido que a instancia existirá no momente que vc fizer “MySingleton.INSTANCE”.
Não acho. Então seria o mesmo que declarar dentro de um bloco estático:
[code]public class A {
public static A instance;
static {
instance = new A();
}
}[/code]
Independente dessa pequena discordância, volto a dizer que o ideal é usar uma implementação de Pool. Se está usando JDBC, tem alguns disponíveis. Como desenvolvo somente JEE, é tudo via injeção, portanto, desconheço boas implementações
Mas já vi n tópicos citando boas implementações, dá uma pesquisada no fórum mesmo.
Abraços.