Tôi đang cố khắc phục sự cố với ứng dụng Java đang sử dụng JDBC để kết nối với cơ sở dữ liệu MySQL. Vấn đề bề mặt là khi kết nối với một cơ sở dữ liệu hợp lệ, DriverManager.getConnection đôi khi sẽ trả về NULL, trong khi chỉ một vài phút sau nó sẽ trả về một kết nối hợp lệ cho cùng một cơ sở dữ liệu.Java/JDBC/MySQL: Làm cách nào để khắc phục sự cố tại sao DriverManager.getConnection() trả về NULL?
Tôi đang ở vị trí của cố gắng để khắc phục vấn đề này, nhưng hiểu biết của tôi về nơi Java, JDBC, và MySQL gặp nhau là khá hạn chế. Tôi đã làm rất nhiều nghiên cứu về điều này, nhưng đã đánh một bức tường và không biết đi đâu từ đây.
Dưới đây là những gì tôi đã làm như vậy cho đến nay:
- Trên cuối Java, tôi đã bắt nguồn từ mã tất cả các cách để DriverManager.getConnection(). Tôi đã xác định rằng kết nối NULL là đến từ đó, nhưng tôi không có đầu mối những gì diễn ra dưới mui xe của getConnection. Tôi đã đấu tranh để tìm một giải thích kỹ lưỡng về điều này trực tuyến.
- Khi kết thúc MySQL, tôi đã xác minh rằng có rất nhiều kết nối có sẵn cho tôi (khoảng 1000 kết nối miễn phí), vì vậy tôi biết tôi không vượt quá các kết nối tối đa ở đó. Xem nhật ký, tôi đã có thể xác định rằng có số lượng kết nối bị hủy bỏ cao hơn một chút trong khung thời gian mà tôi gặp phải nhiều sự cố nhất, nhưng tôi không biết cách xác định lý do tại sao các kết nối này bị hủy bỏ (đã làm MySQL) abort, JDBC, ứng dụng Java?) Tôi không chắc liệu có bất cứ điều gì khác mà tôi cần phải tìm kiếm vào cuối MySQL không.
- Ở giữa, với JDBC, tôi khá lạc. Tôi đã được đọc trên MySQL Connector/J tại http://dev.mysql.com/doc/refman/5.1/en/connector-j.html, nhưng tôi không chắc chắn nếu thông tin đó liên quan đến trình điều khiển JDBC đang được sử dụng bởi Java.
Bất kỳ hướng nào đến nơi tôi có thể đi từ đây sẽ được đánh giá cao.
Cảm ơn!
EDIT - 2/15, 10:35 am CST Tôi xin lỗi vì không cụ thể hơn. Ứng dụng này là một ứng dụng sản xuất thường hoạt động tốt. Nó xử lý thành công hàng chục ngàn kết nối mỗi ngày mà không có bất kỳ vấn đề nào, chỉ là vấn đề này sẽ xáo trộn vào những thời điểm ngẫu nhiên trong ngày và sẽ tồn tại trong khoảng từ 30 giây đến 5 phút khi nó xảy ra.
Dưới đây là đoạn code mà tôi đã bắt nguồn từ tất cả các con đường xuống DriverManager.getConnection:
var dbConn = DatabaseConnectionFactory.createDatabaseConnection('com.mysql.jdbc.Driver','jdbc:mysql://'+ serverName +':' + port + '/' + database, userName, password);
public static DatabaseConnection createDatabaseConnection(String driver, String address, String username, String password) throws SQLException {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
Properties info = new Properties();
info.setProperty("user", username);
info.setProperty("password", password);
// this property should only be set if it's for embedded database
info.setProperty("shutdown", "true");
return new DatabaseConnection(address, info);
}
public DatabaseConnection(String address, Properties info) throws SQLException {
logger.debug("creating new database connection: address=" + address + ", " + info);
this.address = address;
connection = DriverManager.getConnection(address, info);
}
Tôi không tin rằng có thực sự là bất kỳ vấn đề với mã, mà là một vấn đề ở đâu đó ở giữa getConnection() và MySQL.
Đăng một số mã và sẽ giúp bạn dễ dàng hơn. – duffymo
có vẻ như kết nối (mạng) không đáng tin cậy và máy của bạn không phải lúc nào cũng kết nối với máy mà db đang bật, vì vậy đôi khi kết nối không thể được thiết lập –
Jeff - Đó là sự nghi ngờ của tôi, nhưng rất khó để nói nơi điều này có thể xảy ra. Nếu có một số cách để tôi xác định các lý do khác nhau tại sao DriverManager.getConnection sẽ trả về NULL, điều đó sẽ giúp tôi theo dõi vấn đề này một cách đáng kể. – TACHEON