Banco de Dados + Thread [RESOLVIDO]

23 respostas
evertonsilvagomesjav

Ola galera to fazendo uma aplicaçao pequena aqui de gravar dados do cadastro no banco de dados. Porém quando esta sendo feita a importação meu menu principal some e depois de ser feita a importação ele volta, ou seja tentei implementar uma thread mas continua o mesmo nao sei se implementei certo segue o codigo ai pessoal:

Classe do banco de dados:

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{

	public void run(String nome, String cpf){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		
		try {
			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ nome +"', '"+ cpf +"')";
			Statement statement = conn.createStatement();
			statement.execute(sql);
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
	}

	
	
}

Classe Banco onde envia nome e cpf ao metodo run da classe BancoDeDados:

/* metodo responsavel por enviar nome e cpf para o metodo run na classe BancoDeDados */
 	public void gravaDadosBancoDeDados(){
 		if(this.listaClientes.size() > 0){
 			for(int i=0; i < this.listaClientes.size(); i++){
 				BancoDeDados bd = new BancoDeDados();
 					Cliente cli = this.listaClientes.get(i);
 						bd.run(cli.getNome(), cli.getCpf());
 							bd.start();
 			}
 		}else{
 			JOptionPane.showMessageDialog(null,"Nao existe clientes cadastrados");
 		}
 		
 	}

ESPERO AJUDA AE PESSOAL VLW!

23 Respostas

EugenioMonteiro

A classe Thread foi implementada erradamente. O correto seria o método run sem parâmetros. Da forma que você fez, está simplesmente chamando um método de uma classe (o método run), sem necessariamente iniciar uma thread para fazer isso.

G

pq tu num faz um metodo inserir cliente?

ps: tu trabalha na squadra?

evertonsilvagomesjav


A classe Thread foi implementada erradamente. O correto seria o método run sem parâmetros. Da forma que você fez, está simplesmente chamando um método de uma classe (o método run), sem necessariamente iniciar uma thread para fazer isso.

Se eu nao colocar parametros no metodo run como que vou inserir nome e cpf desse modo entao? tem como da um exemplo?


pq tu num faz um metodo inserir cliente?

ps: tu trabalha na squadra?

eu tenho um metodo inserir cliente. Eu nao trabalho nao faço curso la.

lina
evertonsilvagomesjava:
A classe Thread foi implementada erradamente. O correto seria o método run sem parâmetros. Da forma que você fez, está simplesmente chamando um método de uma classe (o método run), sem necessariamente iniciar uma thread para fazer isso.

Se eu nao colocar parametros no metodo run como que vou inserir nome e cpf desse modo entao? tem como da um exemplo?

Oi,

Criar um construtor para esta classe não resolve ??

public class BancoDeDados extends Thread{

        String io_nome, io_cpf;          
  
	public BancoDeDados(String nome, String cpf) {
              io_nome = nome;
              io_cpf = cpf;
        }
        ....
}

Tchauzin!

EugenioMonteiro

Na classe que extends Thread, você colocar atributos:

public class BancoDeDados extends Thread{ 
  private String nome;
  private String cpf;
  public void setCpf(String cpf){
     this.cpf=cpf;
  }

  public void setNome(String nome){
    this.nome=nome;
  }

  public void run(){
  
  //aqui você usa os valores de this.nome e this.cpf

  }


}

Agora após instanciar a classe BancoDeDados vc chama os métodos set, passa os valores e depois dá um start(). Obs: não se chame o método run() diretamente.

evertonsilvagomesjav

Tentei fazer com construtor mais agora nao importa nao sei se esta correto. Alguem ajuda ae?

Método que envia nome e cpf ao construtor da classe banco de dados.
public void gravaDadosBancoDeDados(){
 		if(this.listaClientes.size() > 0){
 			for(int i=0; i < this.listaClientes.size(); i++){
 				Cliente cli = this.listaClientes.get(i);
 					BancoDeDados bd = new BancoDeDados(cli.getNome(), cli.getCpf());
 						bd.start();
 			}
 		}else{
 			JOptionPane.showMessageDialog(null,"Nao existe clientes cadastrados");
 		}
 		
 	}

Classe Banco de Dados:

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{
		
		String nome, cpf;
		
		public BancoDeDados(String nome, String cpf) {
			this.nome = nome;
			this.cpf = cpf;
	}

		public void run(String nome, String cpf){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		
			try {
		
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ this.nome +"', '"+ this.cpf +"')";
			Statement statement = conn.createStatement();
			statement.execute(sql);
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}
lina

Oi,

Você continua passando argumentos no método run() {...}

Esse não foi o motivo de criar um construtor ? Logo, você não precisa + de argumentos:

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{
		
		String nome, cpf;
		
		public BancoDeDados(String nome, String cpf) {
			this.nome = nome;
			this.cpf = cpf;
	}

		public void run(){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		
			try {
		
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ this.nome +"', '"+ this.cpf +"')";
			Statement statement = conn.createStatement();
			statement.execute(sql);
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}

Tchauzin!

evertonsilvagomesjav

Ola Lina, ele importou mas parece que a thread nao esta funcionando perfeitamente e esta dando uns erros no console olha so os erros:

Last packet sent to the server was 0 ms ago.
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:2814)
	at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at com.squadra.caixa.persistencia.entidade.BancoDeDados.run(BancoDeDados.java:25)
lina

Oi,

Isso ai é problema de conexão com o mysql.

De uma olhada.:

http://www.sqlpower.ca/forum/posts/list/1911.page

http://www.google.com.br/search?hl=pt-BR&source=hp&q=Last+packet+sent+to+the+server+was+0+ms+ago.&meta=&aq=f&oq=

Tchauzin!

evertonsilvagomesjav

Acho que nao é nao pq quando uso metodo dessa forma nao da erro nenhum porém sem thread:

public void gravaDadosBancoDeDadosTeste(){
 		if(this.listaClientes.size() > 0){
 			for(int i=0; i < this.listaClientes.size(); i++){
 				Cliente cli = this.listaClientes.get(i);
 					BancoDeDados bd = new BancoDeDados();
 						bd.bancoDeDados(cli.getNome(), cli.getCpf());
 			}
 		}else{
 			JOptionPane.showMessageDialog(null,"Nao existe clientes cadastrados");
 		}
 		
 	}
CLASSE BANCO DE DADOS:
package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{
		
		String nome, cpf;
		
		public BancoDeDados() {
			
	}

		public void bancoDeDados(String nome, String cpf){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		
			try {
		
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ nome +"', '"+ cpf +"')";
			Statement statement = conn.createStatement();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}

agora tentando implementar a thread esta dando o erro e a thread nao esta funcionando =/

com trhead esta assim:

public void gravaDadosBancoDeDados(){
 		if(this.listaClientes.size() > 0){
 			for(int i=0; i < this.listaClientes.size(); i++){
 				Cliente cli = this.listaClientes.get(i);
 					BancoDeDados bd = new BancoDeDados(cli.getNome(), cli.getCpf());
 						bd.start();
 			}
 		}else{
 			JOptionPane.showMessageDialog(null,"Nao existe clientes cadastrados");
 		}
 	}

CLASSE BANCO DE DADOS COM THREAD:

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{
		
		String nome, cpf;
		
		public BancoDeDados(String nome, String cpf) {
			this.nome = nome;
			this.cpf = cpf;
	}

		public void run(){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		
			try {
		
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ this.nome +"', '"+ this.cpf +"')";
			Statement statement = conn.createStatement();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}

ASSIM DA ERRO NAO SEII PQ.

G

cara nao acostuma vo meio q fazer aqui para voce mas nao tenho como testar portanto pode sair erros

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BancoDeDados extends Thread{
		
		String nome, cpf;
		
		public BancoDeDados(String nome, String cpf) {
			this.nome = nome;
			this.cpf = cpf;
	}
                //Aqui você pega a conexao com o banco de dados
		public Conection getConexao(){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = (Connection)DriverManager.getConnection(URL, USUARIO, SENHA);
		return conn;
                }
              //na sua aplicacao voce vai chamar o metodo inserir e passar esses dois parametros 
               public void inserir(String nome,String cpf) throws SQLException
    {
        Connection con = getConexao();
        //aqui voce cria seu inser sei como q é nao mas o primeiro ? é o primeiro valor ali q eu to setando
        String sql = "insert into cliente values (null,?,?) ";
        PreparedStatement pst = con.prepareStatement(sql);
        pst.setString(1, nome);
        pst.setString(2, cpf);
        pst.executeUpdate();
        pst.close();
        con.close();
}
}
carlos_hen

Kara… faz o seguinte…

Em vez de dar o looping na sua lista de clientes fora da thread, tendo que criar uma nova
instância em cada lopping, passa como parâmetro essa lista de clientes para a classe BancoDeDados.

Lá dentro você executa o looping e vai inserindo, tendo que abrir e fechar a conexão apenas uma vez.

Acredito que este erro está ocorrendo pois em cada looping você está criando uma nova thread que
está abrindo e fechando a conexão.

Só um detalhe, para executar a instrução no banco, está faltando o comando:

statement.executeUpdate(sql);

Falows…

evertonsilvagomesjav

O galera to precisando de ajuda mesmo to tentando implementar thread mas esta dando erros, exportar os dados pro banco esta acontecendo porem acho que esta com erro na logica, creio que o driver esta carregando varias vezes por isso ta dando erro, me ajudem ae? Segue os metodos:

METODO QUE ESTA NA CLASSE CONTROLLER ONDE DA O START NO METODO RUN QUE ESTA NA CLASSE BANCO DE DADOS

public void gravaDadosBancoDeDados(){
 		
 		BancoDeDados bd = new BancoDeDados(this.listaClientes);
 		
 		bd.start();
 		
 		}
 	}

CLASSE BANCO DE DADOS ONDE ESTAO METODO RUN

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class BancoDeDados extends Thread{
		
		
		List<Cliente> listaClientes =  new ArrayList<Cliente>();
				
		public BancoDeDados(List<Cliente> listaClientes) {
			this.listaClientes = listaClientes;
							
			}

		
		
		public void run(){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
			
			for(int i =0; i< this.listaClientes.size(); i++){
				Cliente cli = this.listaClientes.get(i);	
			
			try {
			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ cli.getNome() +"', '"+ cli.getCpf() +"')";
			Statement statement = conn.createStatement();
			statement.execute(sql);
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}
}
evertonsilvagomesjav

O galera to precisando de ajuda mesmo to tentando implementar thread mas esta dando erros, exportar os dados pro banco esta acontecendo porem acho que esta com erro na logica, creio que o driver esta carregando varias vezes por isso ta dando erro, me ajudem ae? Segue os metodos:

METODO QUE ESTA NA CLASSE CONTROLLER ONDE DA O START NO METODO RUN QUE ESTA NA CLASSE BANCO DE DADOS

public void gravaDadosBancoDeDados(){
 		
 		BancoDeDados bd = new BancoDeDados(this.listaClientes);
 		
 		bd.start();
 		
 		}
 	}

CLASSE BANCO DE DADOS ONDE ESTAO METODO RUN

package com.squadra.caixa.persistencia.entidade;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class BancoDeDados extends Thread{
		
		
		List<Cliente> listaClientes =  new ArrayList<Cliente>();
				
		public BancoDeDados(List<Cliente> listaClientes) {
			this.listaClientes = listaClientes;
							
			}

		
		
		public void run(){
		String USUARIO = "root";
		String SENHA = "palitodedente";
		String URL = "jdbc:mysql://10.0.16.123:3306/javaprogrammer";
			
			for(int i =0; i< this.listaClientes.size(); i++){
				Cliente cli = this.listaClientes.get(i);	
			
			try {
			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(URL, USUARIO, SENHA);
			
			String sql= "insert into cliente(nome, cpf) values ('"+ cli.getNome() +"', '"+ cli.getCpf() +"')";
			Statement statement = conn.createStatement();
			statement.execute(sql);
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e){
			e.printStackTrace();
		}
		}
}
}
carlos_hen

Exemplo funcionando:

Cliente.java

public class Cliente {
	private int codigo;
	private String nome;
	private String cpf;
	
	public Cliente(String nome, String cpf) {
		this.nome = nome;
		this.cpf = cpf;
	}

	public int getCodigo() {
		return codigo;
	}
	
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getCpf() {
		return cpf;
	}
	
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}	
}

BancoDeDados.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

public class BancoDeDados implements Runnable {
	
	List<Cliente> clientes;
	Connection conn; 
	Statement statement;
	
	public BancoDeDados(List<Cliente> clientes){
		this.clientes = clientes;
		Thread thread = new Thread(this);
		thread.start();
	}
	
	public void run() {
		GravaCliente();
	}
	
	public void GravaCliente(){
		
		String usuario = "root";
		String senha = "palitodedente";
		String url = "jdbc:mysql://localhost:3306/javaprogrammer";
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, usuario, senha);
			statement = conn.createStatement();  
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		 for(int i = 0; i < clientes.size(); i++){
			 String sql= "insert into cliente(nome, cpf)"+
			 "values ('"+ clientes.get(i).getNome() +"', '"+ clientes.get(i).getCpf() +"')";  
			 
			 try {
				statement.executeUpdate(sql);
				System.out.println(clientes.get(i).getNome());
			} catch (SQLException e) {
				e.printStackTrace();
			}
		 }
		 
		 try {
			statement.close();
			conn.close();
		 } catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

Principal.java

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Principal {
	
	public static void main(String[] args){
		Cliente cliente1 = new Cliente("Mark", "[telefone removido]");
		Cliente cliente2 = new Cliente("Mary", "[telefone removido]");
		Cliente cliente3 = new Cliente("Tom", "[telefone removido]");
		
		List<Cliente> clientes = new LinkedList<Cliente>();
		clientes.add(cliente1);
		clientes.add(cliente2);
		clientes.add(cliente3);
		
		BancoDeDados bd = new BancoDeDados(clientes);		
		
	}
	
}

Perceba que o carregamento do driver ocorre apenas uma vez, como também o fechamento da conexão.

Falows…

evertonsilvagomesjav

Carlos muitooo obrigado pela ajuda cara!! vlw mesmo!!

G

ou mas ate agora nao intendi q q vc ta querendo fazer… num era melhor fazer um pull de conexao nao? pq se toda vez q vc for listar ou gravar vc ter q validar o acesso no banco…

evertonsilvagomesjav

nao entendi o que vc quis dizer guialeixo

G

teu codigo, vc toda hora q vai fazer qualquer coisa no banco de dados ele valida o usuario, faz uma nova conexao voce ja viu o padrao MVC?

edmarr

teu codigo, vc toda hora q vai fazer qualquer coisa no banco de dados ele valida o usuario, faz uma nova conexao voce ja viu o padrao MVC?

MVC Otimo estudar , porem ele desenvolve pra desktop (swing) , ou seja tem alguns padrões diferentes e talz .

G

teu codigo, vc toda hora q vai fazer qualquer coisa no banco de dados ele valida o usuario, faz uma nova conexao voce ja viu o padrao MVC?

MVC Otimo estudar , porem ele desenvolve pra desktop (swing) , ou seja tem alguns padrões diferentes e talz .

mas em swing eh completamente viavel o uso de MVC, em swt seria outra coisa, mas em swing é tranquilo e correto, eu achei estranho ele fazer a conexao e ja gravar dados, se fosse uma aplicaçao que o usuario teria que validar o acesso desse modo que ele fez daria errado, pois ele teria q fazer um padrao singleton daria mais trabalho do que fazer um pull de conexao, bem eu to tirando essas teses da minha cabeça nao tenho certeza, mas acho que para um padrao de projeto que creio eu que ele va a implementar mais coisas ele deveria nao pensar em fazer funcionar agora, mas fazer ficar viavel para possiveis alteraçoes futuras

evertonsilvagomesjav

hum agora entendi o que vcs disseram, porém nao faço a minima idéia de como concertar isso ou seja nao validar sempre o usuário e fazer uma nova conexão.

G

eu fiz um exemplo pra vc ja so da uma olhada na primeira pagina

Criado 28 de setembro de 2009
Ultima resposta 30 de set. de 2009
Respostas 23
Participantes 6