名前付きパイプを使用して、Connector/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 の try-with-resources 接続ブロックが完了した後)、次のエラー/警告が表示されます。
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 の問題を無効にして、深刻な問題 (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
}
}
}