Problemas com Singleton, erro ao chamar classe

Estou desenvolvendo uma classe que terá como função conectar ao banco de dados. Veja a classe:

import java.sql.*;

public class ConnectDB {
	
	private static Connection connect;
	private static ConnectDB instance;
	
	private ConnectDB()
	{
		
		try {
			
			Class.forName("com.mysql.jdbc.Driver");
			//connect DB
			connect = DriverManager.getConnection("jdbc:mysql://ip/database","root","password");
			
			
		}
		
		catch(SQLException e)
		{
			System.err.println(e.getMessage());
			
		}
		
		catch(ClassNotFoundException e)
		{
			
			System.err.println(e.getMessage());
			
			
		}

		
	}
	
	  public static ConnectDB getInstance()
	  {
		  
		  if(instance == null) {
			  
			  instance = new ConnectDB();
			  
		  }
		  
		  return instance;

		  
	  }
	  
	  public Connection getConnection() 
	  {
		  
		  return instance.getConnection();
		  
	  }

}

Agora, Eu quero chamar o objeto e fazer uma consulta ao banco de dados:

import java.sql.*;
import ConnectDB;

import sun.security.jca.GetInstance.Instance;

public class getInfo {
		
	private String query = "select from tables";
	String errorException;
	String success;
	
	public void getInfo()
	{	
		System.out.println("Connected!");
		ConnectDB cnn = ConnectDB.getInstance();
	      Connection connection = cnn.getConnection();
		PreparedStatement ps;
		ResultSet rs;
		
		try {
			
			ps = connection.prepareStatement(query);
			success = "Conexão efetuada com sucesso!";
			
			
		} 
		catch(SQLException e )
		{
			System.out.println(e.getErrorCode());
			errorException = "Error ao obter dados!";
			
		}
		
		
	}
	


}

Veja o erro ao executar minha aplicação.

java.lang.StackOverflowError;
ConnectDB.getConnection(ConnectDB.java:59)

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

[code] public Connection getConnection()
{

      return instance.getConnection();  
        
  }  

}
[/code]

Quero obter a conexão e poder chamar a variavel para fazer a query.

public static Connection conexao= null; public static Connection getConnection()throws Exception { if(conexao==null) { Class.forName("com.mysql.jdbc.Driver"); conexao=DriverManager.getConnection("jdbc:mysql://ip/database","root","password"); } return conexao; }

Depois é só usar:

public class Banco {
private Connection con = null;
	private Statement st = null;
	private ResultSet rs = null;
	
	public Banco() throws Exception{
		con=Conexao.getConnection();
		st=con.createStatement();
	}

//seus métodos...
}

Apenas uma nota rápida sobre singletons. Para ser thread-safe e ter melhor performance, a melhor forma de se criar singletons é essa…

class MySingleton {

    private static final MySingleton INSTANCE = new MySingleton();

    private MySingleton() {
        //private constructor
    }

    public static MySingleton getInstance() {
        return INSTANCE;
    }
}

Na verdade, essa… :O)

class MySingleton {

    public static final MySingleton INSTANCE = new MySingleton();

    private MySingleton() {
        //private constructor
    }
}

[quote=tveronezi]Na verdade, essa… :O)

[code]
class MySingleton {

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 :frowning:

Mas já vi n tópicos citando boas implementações, dá uma pesquisada no fórum mesmo.
Abraços.

Sinceramente, Eu não consegui compreender o que você fez.

Siga esse tutorial: http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html