我正在使用命名管道以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
}
}
}