JDBC MySQL执行SQL失败

时间:2015-02-06 18:25:54

标签: java mysql jdbc

这是我的代码。我在MySQL中有一个DB用于处理。我提到了与此例外有关的所有问题。但是他们都没有为我效劳。问题在于我使用过的查询。当我将查询作为

SELECT * FROM customers;

然后它工作正常。但是当我将其更新为以下时,将抛出异常。

SELECT * FROM customer WHERE customer_id LIKE " + "'%" + consumerId + "%'

这是我得到的例外。

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

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036)
    at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:627)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1013)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2234)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2064)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:790)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
    at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:395)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:215)
    at com.smart.data.customer.CustomerInfoProvider.findDetails(CustomerInfoProvider.java:81)
    at com.smart.data.customer.CustomerInfoProvider.provideRequiredCustomerDetails(CustomerInfoProvider.java:28)
    at com.smart.data.manipulator.Starter.main(Starter.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2914)
    at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:559)
    ... 22 more
Exception in thread "main" java.lang.NullPointerException
    at com.smart.data.customer.CustomerInfoProvider.provideRequiredCustomerDetails(CustomerInfoProvider.java:30)
    at com.smart.data.manipulator.Starter.main(Starter.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
package com.smart.data.customer;

import org.apache.log4j.Logger;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.Properties;

/**
 * Created with IntelliJ IDEA.
 * User: dulithdecozta
 * Date: 2/5/15
 * Time: 7:20 PM
 * To change this template use File | Settings | File Templates.
 */
public class CustomerInfoProvider {
    static Logger log = Logger.getLogger(CustomerInfoProvider.class.getName());
    ResultSet customerResultSet = null;
    Connection conn = null;

    public void provideRequiredCustomerDetails(ArrayList customerIdArraylist) {
        for (int i = 0; i < customerIdArraylist.size(); i++) {
            try {
                customerResultSet = findDetails(customerIdArraylist.get(i).toString());
                try {
                    while (customerResultSet.next()) {
                        try {
                            System.out.println("Fullname : " + customerResultSet.getString("fullname"));
                            System.out.println("Consumer ID : " + customerResultSet.getString("customer_id"));
                            System.out.println("City : " + customerResultSet.getString("city"));
                            System.out.println("gender : " + customerResultSet.getString("gender"));
                            System.out.println("Occupation : " + customerResultSet.getString("occupation"));
                            System.out.println(i);
                            System.out.println("*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*");
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    public ResultSet findDetails(String consumerId) throws IOException {
        // Load property file
        Properties properties = new Properties();
        // Define an input stream
        InputStream inputStream = null;
        ResultSet rs = null;
        try {
            inputStream = new FileInputStream("/home/abc/Desktop/Jigi/database.properties"); // Path to the property file
        } catch (FileNotFoundException e) {
            log.debug("Exception encountered : File Not Found : ");
            e.printStackTrace();
        }
        try {
            // load a properties file
            properties.load(inputStream);
        } catch (IOException e) {
            log.debug("Exception encountered : A problem with the Input Stream : ");
            e.printStackTrace();
        }
        conn = null;
        Statement stmt = null;
        try {
            Class.forName(properties.getProperty("JDBC_DRIVER"));
            // log.debug("Connecting to database...!!");
            conn = DriverManager.getConnection(properties.getProperty("DB_URL"), properties.getProperty("USER"), properties.getProperty("PASS"));
            //    log.debug("Creating statement...!");
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM customer WHERE customer_id LIKE " + "'%" + consumerId + "%'");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return rs;
    }
}

3 个答案:

答案 0 :(得分:2)

如果我的理论认为你的查询需要太长时间,那么你需要以某种方式缩短查询时间。

你可以尝试

 SELECT col1, col2, col3 
   FROM customer 
  WHERE customer_id LIKE '" +  consumerId + "%'"
  LIMIT 10

如果省略%子句中的前导LIKE,则允许MySQL使用索引查找正确的行。

当您从查询中枚举所需的列时,可以减少网络流量并允许MySQL在构建查询答案时使用一些效率。

当您说LIMIT 10时,如果您的用户出错并请求空字符串,您将避免MySQL尝试返回整个表格的可能性。

您还应该为customerId值使用bind参数。您可以使用JDBC查找如何执行此操作。

答案 1 :(得分:1)

您可以将这些数据保存到数组列表中,并在需要时调用该列表。这可以帮助您防止此异常。这是由于查询的响应时间较短。

答案 2 :(得分:0)

更改查询会返回结果而不会给出异常。

package com.smart.data.customer;

import org.apache.log4j.Logger;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.Properties;

/**
 * Created with IntelliJ IDEA.
 * User: dulithdecozta
 * Date: 2/5/15
 * Time: 7:20 PM
 * To change this template use File | Settings | File Templates.
 */
public class CustomerInfoProvider {
    static Logger log = Logger.getLogger(CustomerInfoProvider.class.getName());
    ResultSet customerResultSet = null;
    Connection conn = null;

    public void provideRequiredCustomerDetails(ArrayList customerIdArraylist) {
        for (int i = 0; i < customerIdArraylist.size(); i++) {
            try {
                customerResultSet = findDetails(customerIdArraylist.get(i).toString());
                try {
                    while (customerResultSet.next()) {
                        try {
                            System.out.println("Fullname : " + customerResultSet.getString("fullname"));
                            System.out.println("Consumer ID : " + customerResultSet.getString("customer_id"));
                            System.out.println("City : " + customerResultSet.getString("city"));
                            System.out.println("gender : " + customerResultSet.getString("gender"));
                            System.out.println("Occupation : " + customerResultSet.getString("occupation"));
                            System.out.println(i);
                            System.out.println("*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*");
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    public ResultSet findDetails(String consumerId) throws IOException {
        // Load property file
        Properties properties = new Properties();
        // Define an input stream
        InputStream inputStream = null;
        ResultSet rs = null;
        try {
            inputStream = new FileInputStream("/home/abc/Desktop/Jigi/database.properties"); // Path to the property file
        } catch (FileNotFoundException e) {
            log.debug("Exception encountered : File Not Found : ");
            e.printStackTrace();
        }
        try {
            // load a properties file
            properties.load(inputStream);
        } catch (IOException e) {
            log.debug("Exception encountered : A problem with the Input Stream : ");
            e.printStackTrace();
        }
        conn = null;
        Statement stmt = null;
        try {
            Class.forName(properties.getProperty("JDBC_DRIVER"));
            // log.debug("Connecting to database...!!");
            conn = DriverManager.getConnection(properties.getProperty("DB_URL"), properties.getProperty("USER"), properties.getProperty("PASS"));
            //    log.debug("Creating statement...!");
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM customer WHERE customer_id=" +consumerId);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return rs;
    }
}