Erro de null pointer exception após iniciar a thread

Boa noite pessoal do GUJ!

Criei uma classe que implementa a “Runnable”. Esta classe cria e me retorna uma conexão com o banco de dados, no método “Run” esta toda a parte da conexão. Instanciei esta classe e na sequência tentei pegar a conexão que ela me retorna, porém, a conexão retornada é null. O mais curioso é que em debug retorna a conexão e na execução normal retorna a conexão nula. Alguém pode ajudar?
Obrigado.

Classe de conexão que implementa Runnable:

public class ConnectionFactoryParalelo implements Runnable {
	
	public Connection con;
	
	@Override
	public void run() {
		
            try {
				Class.forName("oracle.jdbc.OracleDriver");
			} catch (ClassNotFoundException e) {
				
				e.printStackTrace();
			}
			
                     
            try {
				con =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/XE", "teste", "teste");
			} catch (SQLException e) {
				
				e.printStackTrace();
			} 
			System.out.println("Conectado ao banco.");
		
	}	
	
	public Connection getCon() {
		return con;
	}

    
}

Método que salva os dados no banco:

 public void salvaContatoParalelo(Contato c) throws SQLException{
		
    	ConnectionFactoryParalelo cfp = new ConnectionFactoryParalelo();
    	Thread t = new Thread(cfp);
    	t.start();
    	Connection conec = cfp.getCon();
    	  
    	     	
    	String sql;
		sql = "INSERT INTO CONTATOS(ID, NOME, EMAIL, ENDERECO, DATANASCIMENTO) " +
				"VALUES(contatosteste.nextval, ?, ?, ?, ?)";
		
		//criando o prepared statement
		PreparedStatement stmt = conec.prepareStatement(sql);
		
		//seta os valores
		stmt.setString(1, c.getNome());
		stmt.setString(2, c.getEmail());
		stmt.setString(3, c.getEndereco());
		stmt.setDate(4, new Date(c.getDataNascimento().getTimeInMillis())); 
		
		
		//executa o sql
		stmt.execute();
		stmt.close();
		System.out.println("Contato salvo com sucesso.");	
		
	}




Como você tá usando uma Thread, você não tem como garantir que o objeto con esteja inicializado quando o acessa na thread principal.

Por que você tá inicializando a conexão em outra thread?

Bom, nao sei se no oracle é diferente, mais no mysql quando o id é auto incrementavel ele nem entra no sql…

Oi Wagner! Tudo bem? Estou inicializando a conexão em outra thread porque depois vou fazer um teste de performance com o jmeter. Usando a thread posso limitar o tempo por exemplo e simular erros fazendo muitas requisições para salvar no banco.

Tranquilo. :smiley:

Não conheço JMeter, mas você realmente não pode deixar o código desta maneira, a Thread executa numa linha separada, então você não pode garantir que o atributo con seja inicializado antes de utilizá-lo. Quem sabe você deveria executar estas manipulações do banco na própria Thread… não sei qual impacto isto teria para os testes que tu pretende realizar.