2011-09-22 52 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