2015-02-06 208 views
0

這是我的代碼。我在MySQL中有一個用於處理的數據庫。我提到了與這個例外有關的所有問題。但是他們都沒有爲我解決。問題出在我用過的查詢上。當我把查詢作爲JDBC MySQL執行SQL失敗

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

把異常置於你的問題 – 2015-02-06 18:28:27

+0

done @AmirHosseinMehrvarzi – 2015-02-06 18:31:33

+0

你的驅動版本是否與你的MySQL版本兼容? – 2015-02-06 18:35:43

回答

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

如果我的理論,你的查詢時間過長是真的,那麼你需要做的查詢需要較少的時間不知何故。

你可以嘗試

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

當你LIKE子句中省略領先%,你讓MySQL使用索引來找到合適的行。

當您從查詢中列出所需的列時,可以減少網絡流量,並允許MySQL在構建查詢答案時使用一些效率。

當你說LIMIT 10時,如果你的用戶犯了一個錯誤並且請求一個空字符串,你將避免MySQL嘗試返回整個表的可能性。

您還應該爲您的customerId值使用綁定參數。您可以查看如何使用JDBC執行此操作。

+0

是的,我檢查過。謝謝。但仍然沒有工作。從你的程序中,它顯示了比以前更多的數據。但是有一段時間後仍會拋出異常。無論如何,原因是正確的。 – 2015-02-07 04:54:17

1

您可以將這些數據保存到數組列表中,並在需要時調用該列表。這會幫助你防止這種異常。這是由於查詢的響應時間較短。