我正在使用命名管道与连接器/J连接到Java中的MySQL。我的连接和查询是成功的,但是当我试图关闭连接时,我收到一个警告。我想知道我应该做些什么来修复导致警告的原因,而不是删除connection.close()(或删除try-with-resources连接块,而不是添加connection.close())。
下面是我的查询代码: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尝试使用资源连接块完成后),我收到以下错误/警告:
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 **
如果我删除try-with-resources块(并且不添加connection.close()),则警告永远不会出现。此外,如果我切换到TCP/IP连接,错误永远不会出现。但是,这两种解决方案都不能满足我的情况。我想确保连接是正确关闭的,并且我将使用命名管道连接。
任何想法?
——(编辑)——另外:错误是由Connector/J中的日志抛出的。我的错误捕获与如何捕获和打印错误无关。我试图研究如何禁用WARN问题,并让它打印出严重的问题(在连接器/J的日志中),但我没有成功。此外,我希望修复WARN问题,而不是忽略/隐藏它。
——(编辑2)——我监控了MySQL数据库,连接没有被关闭。如果我使用TCP/IP连接字符串而不是我的命名管道连接字符串(并且不更改任何其他内容),则连接将正常关闭。
——(编辑3)——忽略我原来的代码…只要试试下面的代码,它就会抛出警告。对我来说好像是个bug。
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
}
}
}
由于这似乎是一个bug,我已经向MySQL bug论坛提交了一个官方的bug报告。
当我收到更新时,我会在这里发布。
更新:我的bug报告是由MySQL编码人员分析的。他们认为这是一个JAVA错误。
错误报告