简体   繁体   English

JDBC MySQL执行SQL失败

[英]JDBC MySQL execute SQL failures

This is my code. 这是我的代码。 I have a DB in MySQL which I use for processing. 我在MySQL中有一个用于处理的数据库。 I referred to all the questions related to this exception. 我提到了与此例外有关的所有问题。 But none of them worked out for me. 但是他们都不适合我。 The problem is with the query I have used. 问题是我使用过的查询。 When I make the query as 当我查询为

SELECT * FROM customers;

Then it works fine. 然后工作正常。 But when I update it to following, exception will be thrown. 但是,当我将其更新为以下内容时,将引发异常。

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

This is the exception I get. 这是我的例外。

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;
    }
}

If my theory that your query takes too long is true, then you need to make the query take less time somehow. 如果我的理论认为查询花费的时间太长,那么您需要以某种方式减少查询的时间。

You could try 你可以试试

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

When you omit the leading % in the LIKE clause, you allow MySQL to use an index to find the right rows. 当您在LIKE子句中省略前导%时,允许MySQL使用索引来查找正确的行。

When you enumerate the columns you need from your query, you reduce the network traffic and allow MySQL to use some efficiencies in constructing the answer to your query. 当您从查询中枚举所需的列时,可以减少网络流量,并允许MySQL使用一些效率来构造查询的答案。

When you say LIMIT 10 , you avoid the possibility that MySQL will try to return the whole table if your user makes a mistake and requests an empty string. 当您说LIMIT 10 ,可以避免MySQL在用户输入错误并请求一个空字符串时尝试返回整个表的可能性。

You should also use a bind parameter for your customerId value. 您还应该为您的customerId值使用一个绑定参数。 You can look up how to do this with JDBC. 您可以查找如何使用JDBC执行此操作。

You could save those data into an array list and call that list when you need it. 您可以将这些数据保存到数组列表中,并在需要时调用该列表。 That would help you to prevent this exception. 那将帮助您防止此异常。 This is due to low response time of the query. 这是由于查询的响应时间短。

Changing the Query returned the results without giving the exception. 更改查询将返回结果而没有给出异常。

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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM