2011-09-22 64 views
2

我正在使用命名管道以Connector/J連接到MySQL。我的連接和查詢成功,但當我嘗試關閉連接時收到警告。我想知道我應該怎麼做才能修復除了刪除connection.close()(或刪除try-with-resources連接塊而不添加connection.close())之外的警告。Java MySQL - 命名管道連接在關閉時拋出警告

這裏是我的查詢代碼:

public static List<List> QueryDB(int RowValue) { 
    List<Long> ValueList = new ArrayList(); 

     try { 
      try (Connection Connection_T = MySQLConnectionResources.createConnection()) { 
       try (Statement Statement_T = Connection_T.createStatement()) { 
        String String_T = "SELECT AColumn FROM ATable WHERE BColumn = " + RowValue + ";"; 
        try (ResultSet ResultSet_T = Statement_T.executeQuery(String_T)) { 
         while (ResultSet_T.next()) { 
          ValueList.add(ResultSet_T.getLong("AColumn")); 
         } 
        } 
       } 
      } 
     } catch(SQLException SQLException_P) { 
      System.err.println("ERROR: Failed to query the database."); 
      ValueList.clear(); 
     } 

    List<List> Result_M = new ArrayList(); 
    Result_M.add(ValueList); 
    return Result_M; 
} 

「MySQLConnectionResources」 只是與方法 「的createConnection()」 的自定義類。這個類/方法沒有什麼特別之處;它只是創建並返回一個連接。

方法完成(或技術,在Java 7的try-與資源連接塊完成後),我收到以下錯誤/警告後:

Thu Sep 22 00:31:54 EDT 2011 WARN: Caught while disconnecting... 

EXCEPTION STACK TRACE: 



** BEGIN NESTED EXCEPTION ** 

java.net.SocketException 
MESSAGE: Socket is not connected 

STACKTRACE: 

java.net.SocketException: Socket is not connected 
    at java.net.Socket.shutdownInput(Socket.java:1456) 
    at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1687) 
    at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4368) 
    at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1557) 
    at ... my class/method here (my class.java:#) 


** END NESTED EXCEPTION ** 

如果我刪除了嘗試,與 - 資源塊(並且不添加connection.close()),警告從不出現。另外,如果我切換到TCP/IP連接,則錯誤不會出現。但是,這些解決方案都不適合我的情況。我想確保連接正確關閉,我將使用命名管道連接。

任何想法?

- (編輯) - 此外:連接器/ J中的日誌引發錯誤。我的錯誤捕捉與錯誤如何被捕獲和打印無關。我試圖研究如何禁用WARN問題,並打印出嚴重問題(在Connector/J的日誌中),但我沒有成功。此外,我想解決WARN問題,而不是忽略/隱藏它。

- (編輯2) - 我監視MySQL數據庫並且連接沒有關閉。如果我使用TCP/IP連接字符串而不是命名的管道連接字符串(並且不更改其他任何內容),連接就會關閉。

- (編輯3) - 忽略我的原始代碼...只是嘗試下面的代碼,它會引發警告。對我來說就像一個錯誤。

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public final class main { 
    public static void main(String[] args) { 
     Connection conn = null; 
     try { 
      conn = 

DriverManager.getConnection("jdbc:mysql:///database?socketFactory=com.mysql.jdbc.NamedPipeSocketFactory&namedPipePath=\\\\.\\Pipe\\mysql.sock", 
"root", "password"); 

      conn.close(); 


     } catch (SQLException ex) { 
      // handle any errors 
     } 
    } 
} 

回答

0

由於它似乎是一個錯誤,我已經向MySQL錯誤論壇提交了一個官方錯誤報告。

我會在每次收到更新時回覆此處。

更新:

我的錯誤報告由MySQL編碼人員分析。他們認爲這是一個JAVA錯誤。

Bug Report