Я подключаюсь к MySQL в Java с помощью Connector / J, используя именованные каналы. Мое соединение и запрос выполнены успешно, но я получаю предупреждение при попытке закрыть соединение. Я хотел бы знать, что я должен сделать, чтобы исправить все, что вызывает предупреждение, кроме удаления 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. Моя перехват ошибок не имеет никакого отношения к тому, как ошибка перехватывается и печатается. Я пытался выяснить, как отключить проблемы ПРЕДУПРЕЖДЕНИЯ и распечатать его только ПРОБЛЕМЫМИ проблемами (в Журнале Соединителя / 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
}
}
}