MySQL异常com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

时间:2014-04-29 11:17:15

标签: java mysql

`

import java.sql.*;

public class Match {
    public static void main(String args[]) throws Exception{
        DBConnection1 con = new DBConnection1();
        DBConnection con1 = new DBConnection();
        Connection conn = null,conn1=null;
        conn = con.getConnection();
        conn1 = con1.getConnection();
        Statement st = null;
        PreparedStatement pst = null;
        ResultSet rs = null,rs1 = null;
        st = conn.createStatement();
        String query1 = "SELECT Name FROM Employee WHERE Name=?";
        pst = conn1.prepareStatement(query1);
        st.setFetchSize(Integer.MIN_VALUE);
        String query = "SELECT name FROM emp";
        rs = st.executeQuery(query);
        String name = "";
        int count = 0;
        while(rs.next()){
            title = rs.getString("name");
            pst.setString(1, title);
            rs1 = pst.executeQuery();
            while(rs1.next()){
                    count++;
                    if(count % 100 == 0)
                        System.out.println(count);
            }
        }
        System.out.println(count);
    }
}

`

我根据来自其他数据库的某些值从非常大的数据库中选择值。我在while循环中运行我的select查询。在得到很多结果后运行我的java代码后,我得到了

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure exception. 

我不知道为什么会这样。如果你们有任何想法请帮助

我已根据此异常阅读旧问题,但这些问题都没有帮助。

2 个答案:

答案 0 :(得分:2)

import java.sql.*;

public class Match {
    public static void main(String args[]) throws Exception{
        DBConnection1 con = new DBConnection1();
        DBConnection con1 = new DBConnection();
        Connection conn = null,conn1=null;
        conn = con.getConnection();
        conn1 = con1.getConnection();
        Statement st = null;
        PreparedStatement pst = null;
        ResultSet rs = null,rs1 = null;
        st = conn.createStatement();
        st.setFetchSize(Integer.MIN_VALUE);
        String query = "SELECT name FROM emp";
        rs = st.executeQuery(query);
        String title = "",query1="";
        StringBuffer newQuery = new StringBuffer("SELECT Name FROM Employee WHERE ");
        int count = 0;
        long nameCount = 0L;
        while(rs.next()){
            nameCount++;
            title = rs.getString("name");
            query1 = "Name=? or";
            pst = conn1.prepareStatement(query1);
            pst.setString(1, title);

            newQuery.append(pst.toString().substring(pst.toString().indexOf('N'), pst.toString().length())+" ");
        }

        if ( nameCount > 0 ){
            String Query = newQuery.toString().substring(0,newQuery.toString().length() - 3);  
            rs1 = conn1.createStatement().executeQuery(Query);
            while(rs1.next()){
                count++;
                if(count % 50 == 0)
                    System.out.println(count);
            }
        }
    }
}

使用PreparedStatement解决了SQL注入攻击的问题。现在代码正在运行。

答案 1 :(得分:1)

我认为此代码已经过优化,但可能会出现一些语法错误:

import java.sql.*;

public class Match {
    public static void main(String args[]) throws Exception{
        DBConnection1 con = new DBConnection1();
        DBConnection con1 = new DBConnection();
        Connection conn = null,conn1=null;
        conn = con.getConnection();
        conn1 = con1.getConnection();
        Statement st = null;

        ResultSet rs = null,rs1 = null;
        st = conn.createStatement();
        //String query1 = "SELECT Name FROM Employee WHERE Name=?";

        st.setFetchSize(Integer.MIN_VALUE);
        String query = "SELECT name FROM emp";
        rs = st.executeQuery(query);
        String name = "";

        StringBuffer newQuery = new StringBuffer("SELECT Name FROM Employee WHERE");
        int count = 0;
        long nameCount = 0L;
        while(rs.next()){
            nameCount++;
            title = rs.getString("name");
            newQuery.append(" Name='" + title + "' or");
        }

        if ( nameCount > 0 ){
            newQuery = newQuery.subString( newQuery.length() - 3);  
            rs1 = conn1.createStatement.executeQuery( newQuery );
            while(rs1.next()){
                count++;
                if(count % 100 == 0)
                    System.out.println(count);
            }
        }
    }
}

链接失败可能是因为执行了很多查询。因此,我只启动了一两个查询,您将获得所有结果。

相关问题