Problemas com o MYSQL - JDBC

6 respostas
K

olá, possuo uma aplicação que utiliza MYSQL e conexão atraves da JDBC do MySQL.

Bom quando vou fazer um insert numa tabela do bd (é a importação de 23.000 registros) quando chega perto do registro 4.000 ele dá a seguinte mensagem de erro. O insert dos dados é feito um por um, não sei se isso pode ser o problema?

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** 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:156)

at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)

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

at com.mysql.jdbc.Connection.<init>(Connection.java:1485)

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

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

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

at bd.banco.getConnection(banco.java:70)

at bd.insert.insere(insert.java:30)

at importacao.importa_tim.run(importa_tim.java:275)

at java.lang.Thread.run(Thread.java:595)

** END NESTED EXCEPTION **

Last packet sent to the server was 17 ms ago.

Agradeço a ajuda desde já.
Guilherme

6 Respostas

J

Não será porque você está criando conexões demais?

D

vc está usando alguma pool de conexoes?
vc disse q. faz a inserção dos registros um a um…por acaso vc estaria abrindo uma conexão para cada inserção?

t+

K

Cara, acho que não, dá uma olhada na minha classe que faz a conexão com o BD para insert's

package bd;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author KIKO
 */
public class insert &#123;
    
    /** Creates a new instance of insert */
    public insert&#40;&#41; &#123;
    &#125;
    public static void insere&#40;String sql&#41; throws SQLException&#123;
         try &#123;
            banco.init&#40;&#41;;
            Connection conn = banco.getConnection&#40;&#41;;
            Statement stat = conn.createStatement&#40;&#41;;
            stat.execute&#40;sql&#41;;
            conn.close&#40;&#41;;
            stat.close&#40;&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            ex.printStackTrace&#40;&#41;;
        &#125; catch &#40;ClassNotFoundException ex&#41; &#123;
            ex.printStackTrace&#40;&#41;;
        &#125;
    &#125;
&#125;

Ele abre a conexão, faz o insert e fecha a conexão.

Tem alguma sugestão para melhorar o codigo?

J

Sugiro isso:

Como são varias inserções idênticas, eu sugiro o uso de PreparedStatement, pois ele compila a expressão, tornando a execução mais rápida e menos custosa. E use uma conexão só também.

Não sei que tipo de objeto você está inserindo, mas suponhamos que sejam usuários, com nome, login e senha.

Ex.:

public class UsuarioDAO&#123;

    public void inserir&#40;List&lt;Usuario&gt; usuarios&#41; throws SQLException &#123;
         try &#123;
            banco.init&#40;&#41;;
            Connection conn = banco.getConnection&#40;&#41;;
            PreparedStatement stmt = conn.prepareStatement&#40;&quot;INSERT INTO usuario&#40;nome, login, senha&#41; VALUES &#40;?, ?, ?&#41;&quot;&#41;;

            for&#40;Usuario usu &#58; usuarios&#41;&#123;
               stmt.clearParameters&#40;&#41;;
               stmt.setString&#40;1, usu.getNome&#40;&#41;&#41;;
               stmt.setString&#40;2, usu.getLogin&#40;&#41;&#41;;
               stmt.setString&#40;3, usu.getSenha&#40;&#41;&#41;;
               stmt.executeUpdate&#40;&#41;;
            &#125;
            conn.close&#40;&#41;;
            stat.close&#40;&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            ex.printStackTrace&#40;&#41;;
        &#125; catch &#40;ClassNotFoundException ex&#41; &#123;
            ex.printStackTrace&#40;&#41;;
        &#125;
    &#125;
&#125;
_

Voce pode receber um Connection nos parametros do método, aí voce abre fora dele, e não precisa abrir repetidas vezes…
algo como:

public static void insere&#40;String sql, Connection conn&#41; &#123;
  //sua implementaçao
&#125;

//voce usaria assim&#58;
Connection conn = //pega conexao
for&#40;...&#41; &#123; //faz seu loop
  insere&#40;suasql, conn&#41;;
&#125;
K

Obrigado, vou testar essas dicas, qualquer coisa volto a escrever.

Obrigado novamente pela ajuda, acho que agora vai funcionar.

Criado 18 de janeiro de 2007
Ultima resposta 18 de jan. de 2007
Respostas 6
Participantes 4