Arquivos e Banco de Dados

7 respostas
T

Pessoal tenho uma classe que possui um método para listar os arquivos de um diretório, em seguida dentro de um loop eu acesso cada arquivo, extraio alguns dados dele e insiro em um BD MySQL. O problema é que as vezes dá um excessão louca e não sei o porque.

Alguém pode me ajudar?

Exception lançada :
16/06/2008 23:00:43 Consultor cadastrar
SEVERE: null
java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.SocketException: java.net.BindException: Address already in use: connect

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: java.net.BindException: Address already in use: connect

STACKTRACE:

java.net.SocketException: java.net.BindException: Address already in use: connect

at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:143)

at com.mysql.jdbc.MysqlIO.(MysqlIO.java:225)

at com.mysql.jdbc.Connection.createNewIO(Connection.java:1805)

at com.mysql.jdbc.Connection.(Connection.java:452)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)

at java.sql.DriverManager.getConnection(DriverManager.java:582)

at java.sql.DriverManager.getConnection(DriverManager.java:185)

at BancoDeDados.getConexao(BancoDeDados.java:33)

at Consultor.cadastrar(Consultor.java:97)

at Arquivo.extraiDados(Arquivo.java:165)

at Arquivo.main(Arquivo.java:210)

** END NESTED EXCEPTION **

at com.mysql.jdbc.Connection.createNewIO(Connection.java:1875)
    at com.mysql.jdbc.Connection.<init>(Connection.java:452)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at BancoDeDados.getConexao(BancoDeDados.java:33)
    at Consultor.cadastrar(Consultor.java:97)
    at Arquivo.extraiDados(Arquivo.java:165)
    at Arquivo.main(Arquivo.java:210)

7 Respostas

T

Só para reforçar… As vezes executa normalmente e as vezes gera uma exceção.

shoko

O driver é da mesma versão do sql q vc está usando?

T

Sim.

berg.pb

Posta o código…

T
import com.mysql.jdbc.PreparedStatement;

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Consultor {

private String nome;
private String logradouro;
private String localizacao;
private String email;
private String telefone;
private String cep;

private static final String SQL_CADASTRAR_CONSULTOR = "INSERT INTO consultor (nome, logradouro, localizacao, telefone, email, cep)" +
        "VALUES (?,?,?,?,?,?)";

   
public void cadastrar(){
    PreparedStatement ps = null;
    try {
        Connection con = BancoDeDados.getConexao();
        ps = (PreparedStatement) con.prepareStatement(SQL_CADASTRAR_CONSULTOR);
        ps.setString(1, this.getNome());
        ps.setString(2, this.getLogradouro());
        ps.setString(3, this.getLocalizacao());
        ps.setString(4, this.getTelefone());
        ps.setString(5, this.getEmail());
        ps.setString(6, this.getCep());
        ps.executeUpdate();
        
    } catch (SQLException ex) {
        Logger.getLogger(Consultor.class.getName()).log(Level.SEVERE, null, ex);
    } 
}

}

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.logging.Level;

import java.util.logging.Logger;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Arquivo {

/**
 * Abre um arquivo e retorna uma string com seu conteudo
 * @param arquivo
 * @return
 */
public String abrir(String arquivo){

    FileReader fileReader = null;
    String str = "";
    String conteudo = "";
            
    try {
        fileReader = new FileReader(arquivo);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        while ((str = bufferedReader.readLine()) != null) {
            conteudo += str;
        }   

    } catch (FileNotFoundException ex) {
        Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            fileReader.close();
        } catch (IOException ex) {
            Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    return conteudo;
}



/**
 * Lista os arquivos de um diretorio
 * @param diretorio
 * @return List
 */
public List listarDiretorio(String diretorio) {
    
    String nomeFile = "";
    File f = new File(diretorio);
    List<String> lista = new ArrayList<String>();
    int arqComp = 0;
    File fList[] = f.listFiles();
    
    for(int i = 0; i < fList.length; i++) {
        nomeFile = fList[i].getName();
        int pos = nomeFile.indexOf(" .txt");
        
        if(pos != -1){
            lista.add(fList[i].getName());
        } else {
            arqComp++;
        } 
                   
    }
    return lista;
}


public void extraiDados(String s, String cep){
    Consultor c = new Consultor();
    String[] arrConsultor = new String[6];
    String idInicio = "name=\"cdConsultoraEscolhida\"";
    String idFim = "</div>";
    
    String conteudo = "";
    int inicio = 0, fimNome = 0, cont = 0;
    
    Pattern p = Pattern.compile(""+idInicio+"(.*?)"+idFim+"");
    Matcher m = p.matcher(s);
    Pattern pattern = Pattern.compile("<br/>");
    
    // enquanto o Matcher encontrar o pattern na String fornecida:
    while(m.find()){
        
        conteudo = m.group();
        arrConsultor = conteudo.split("<br/>");
        inicio = conteudo.indexOf("<b>");
        fimNome = conteudo.indexOf("</b>");
        
        Matcher matcher = pattern.matcher(conteudo);
        cont = 0;
        while(matcher.find()){
            cont++;
        }
        c.setNome(conteudo.substring(inicio+3,fimNome));
        c.setLogradouro(arrConsultor[1].replace("				", "").replace("&nbsp;", " "));
        
        c.setCep(cep);
        if(cont == 4) {
            c.setLocalizacao("");
            c.setTelefone("");
            c.setEmail(arrConsultor[2].toLowerCase());
            
        }else if(cont == 5) {
            c.setEmail(arrConsultor[3].toLowerCase());
            if(arrConsultor[2].indexOf("(") != -1){
                c.setLocalizacao("");
                c.setTelefone(arrConsultor[2].replace("&nbsp;", " "));    
            }else if(arrConsultor[2].indexOf(",") != -1){
                c.setTelefone("");
                c.setLocalizacao(arrConsultor[2].replace("&nbsp;", " "));
            } else {
                c.setLocalizacao("");
            }
            
        } else if(cont == 6) {
            c.setLocalizacao(arrConsultor[2].replace("&nbsp;", " "));
            c.setTelefone(arrConsultor[3].replace("&nbsp;", " "));
            c.setEmail(arrConsultor[4].toLowerCase().replace("   ", ""));

        }
        c.cadastrar();

        
    }

}


public static void main(String[] args){
    int quantFiles = 0;
    
    Arquivo file = new Arquivo();
    String conteudoFile = "";        
    List myList = file.listarDiretorio("c:\\natura");
    for(int i = 0; i < myList.size(); i++){
        System.out.println(myList.get(i));
        conteudoFile = file.abrir("c:\\natura\\" + myList.get(i));
        file.extraiDados(conteudoFile, myList.get(i).toString().substring(0, 8));              
        quantFiles++;
        System.gc();
    }
    System.out.println(quantFiles + " arquivos encontrados");     
    
}

}

public class BancoDeDados {

/* Atributos do banco de dados */
private static String URL = "jdbc:mysql://127.0.0.1/natura"; // URL MySQL
private static String DRIVER = "com.mysql.jdbc.Driver"; // Driver JDBC MySQL
    private static String USUARIO = "root"; // Login do usu&#65533;rio do banco
    private static String SENHA = "12345678"; // Senha do usu&#65533;rio do banco
    private static Connection connection;

public BancoDeDados() {
        
}


/**
 * Obtem uma conexao com o banco de dados.
 */
public static Connection getConexao() {
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USUARIO, SENHA);
        } catch (SQLException ex) {
            Logger.getLogger(BancoDeDados.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(BancoDeDados.class.getName()).log(Level.SEVERE, null, ex);
        }
        return connection;
    }

}

C

Parece que o problema é referente ao excesso de conexões abertas junto ao banco.

Recomendo fortemente que inclua em sua classe BancoDeDados um método para fechar a conexão

Porém a meu ver seria mais interessante ainda você fazer as seguintes alterações:

public static void main(String[] args){

int quantFiles = 0;

BancoDeDados.getConexao(); // abertura de conexão com o banco.

Arquivo file = new Arquivo();

String conteudoFile = “”;

List myList = file.listarDiretorio(c:\natura);

for(int i = 0; i < myList.size(); i++){

System.out.println(myList.get(i));

conteudoFile = file.abrir(c:\natura\” + myList.get(i));

file.extraiDados(conteudoFile, myList.get(i).toString().substring(0, );

quantFiles++;

System.gc();

BancoDeDados.fechaConexao(); // Método a criar.

}

System.out.println(quantFiles + " arquivos encontrados");

}

}

public void cadastrar(){

PreparedStatement ps = null;

try {

//Connection con = BancoDeDados.getConexao(); // exclusão da chamada

ps = (PreparedStatement) BancoDeDados.con.prepareStatement(SQL_CADASTRAR_CONSULTOR); // Chamada direta à conexão dentro de BancoDeDados



ps.setString(1, this.getNome());

ps.setString(2, this.getLogradouro());

ps.setString(3, this.getLocalizacao());

ps.setString(4, this.getTelefone());

ps.setString(5, this.getEmail());

ps.setString(6, this.getCep());

ps.executeUpdate();
} catch (SQLException ex) {

Logger.getLogger(Consultor.class.getName()).log(Level.SEVERE, null, ex);

}

}

public BancoDeDados() {

public static Connection con; // Inclusão de uma conexão publica e estática para acesso por outras classes


}

Ainda recomendo o uso de transações…

C

E eu recomendo o uso da tag code :wink:

Criado 16 de junho de 2008
Ultima resposta 6 de ago. de 2009
Respostas 7
Participantes 5