2011-10-14 40 views
26

tôi (thành công) kết nối với một cơ sở dữ liệu bằng cách sử dụng sau đây:Java JDBC tình trạng kết nối

java.sql.Connection connect = DriverManager.getConnection(
    "jdbc:mysql://localhost/some_database?user=some_user&password=some_password"); 

gì tôi cần phải kiểm tra để xem nếu kết nối vẫn còn mở và lên sau một thời gian?
Tôi đã hy vọng một cái gì đó như connect.isConnected(); có sẵn cho tôi để sử dụng.

Trả lời

15

Không có gì. Chỉ cần thực hiện truy vấn của bạn. Nếu kết nối đã chết, hoặc trình điều khiển JDBC của bạn sẽ kết nối lại (nếu nó hỗ trợ nó, và bạn kích hoạt nó trong chuỗi kết nối của bạn - hầu hết đều không hỗ trợ nó) hoặc nếu không bạn sẽ nhận được một ngoại lệ.

Nếu bạn kiểm tra kết nối, nó có thể bị đổ vỡ trước khi bạn thực sự thực hiện truy vấn của mình, vì vậy bạn hoàn toàn không có gì bằng cách kiểm tra.

Điều đó nói rằng, rất nhiều hồ kết nối xác nhận một kết nối bằng cách làm một cái gì đó giống như SELECT 1 trước khi bàn giao các kết nối ra. Nhưng điều này là không có gì nhiều hơn là chỉ thực hiện một truy vấn, vì vậy bạn có thể cũng thực hiện truy vấn kinh doanh của bạn.

+1

Có một số lợi ích nhất định trong việc kiểm tra kết nối trước khi sử dụng nó (đặc biệt nếu đó là kết nối lâu dài và mạng cơ bản có thể đã sử dụng nó). Nhưng điều này cũng chính xác ở chỗ bạn vẫn cần phải xử lý các lỗi trong mã của riêng bạn vì nó có thể bị hỏng bất cứ lúc nào. – rogerdpack

12

Sử dụng chức năng Connection.isClosed().

Các JavaDoc trạng thái:

Lấy dù đối tượng Connection này đã bị đóng cửa. Một kết nối bị đóng nếu phương thức đóng đã được gọi hoặc nếu một số lỗi nghiêm trọng đã xảy ra. Phương pháp này được đảm bảo để trả lại true chỉ khi nó được gọi sau khi phương thức Connection.close đã được gọi.

+3

Khi javadoc nói rằng điều này sẽ không ** ** cho một câu trả lời hợp lệ trong trường hợp này. Nó sẽ chỉ cho biết liệu 'close()' có được gọi hay không. –

+1

OK sau khi một số thử nghiệm với trình điều khiển JDBC Postgres (ít nhất), về cơ bản, nếu kết nối bên dưới "bị mất", 'isClosed()' sẽ vẫn trả về true. Tuy nhiên, khi bạn sử dụng * kết nối, và nó làm tăng bất kỳ ngoại lệ nào, sau thời điểm đó, 'isClosed()' bây giờ sẽ trả về true. Vì vậy, về cơ bản bạn có thể "lấy đi" bằng cách sử dụng 'isClosed' (và tránh độ trễ của một cuộc gọi thêm vào' isValid() ') nếu bạn bằng cách nào đó có thể trả tiền cho một truy vấn bị gián đoạn ở đây hoặc ở đó. Khác với 'isValid()' là một cách tốt để kiểm tra, nhưng yêu cầu thêm một khoảng thời gian chuyến đi. – rogerdpack

+0

Cảm ơn người đàn ông .. Nó làm việc như một say mê. –

33

cơ hội tốt nhất của bạn là chỉ cần thực hiện một truy vấn đơn giản đối với một bảng, ví dụ:

select 1 from SOME_TABLE; 

Ồ, tôi chỉ thấy có một phương pháp mới có sẵn từ 1.6:

java.sql.Connection.isValid(int timeoutSeconds):

Trả về true nếu kết nối chưa được đóng và vẫn hợp lệ. Trình điều khiển phải gửi truy vấn trên kết nối hoặc sử dụng một số cơ chế khác xác minh tích cực kết nối vẫn hợp lệ khi phương pháp này được gọi. Truy vấn được trình điều khiển gửi để xác thực kết nối sẽ được thực hiện trong ngữ cảnh giao dịch hiện tại .

+0

postgresql jdbc thực thi "select 1", cho bản ghi. – rogerdpack

3

Nếu bạn đang sử dụng MySQL

public static boolean isDbConnected() { 
    final String CHECK_SQL_QUERY = "SELECT 1"; 
    boolean isConnected = false; 
    try { 
     final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY); 
     isConnected = true; 
    } catch (SQLException | NullPointerException e) { 
     // handle SQL error here! 
    } 
    return isConnected; 
} 

tôi đã không thử nghiệm với cơ sở dữ liệu khác. Hy vọng điều này là hữu ích.

+0

'db' xuất phát từ đâu? – MonoThreaded

+0

Xem trong câu hỏi 'kết nối' biến nó là' db' bất cứ điều gì bạn đặt tên nó. –

+0

Sau đó, bạn có thể muốn đóng PreparedStatement của bạn để ngăn chặn rò rỉ bộ nhớ – MonoThreaded

4

Bạn cũng có thể sử dụng

public boolean isDbConnected(con Connection) { 
    //final String CHECK_SQL_QUERY = "SELECT 1"; 
    try { 
     if(!con.isClosed() || con!=null){ 
      return true; 
     } 
    } catch (SQLException e) { 
     return false; 
    } 
    return false; 
} 
+2

Nên, nếu (con! = Null ||! Con.isClosed()) sao cho kiểm tra của bạn là trên đối tượng đầu tiên, nếu nó null nó sẽ không tiếp tục với việc xác nhận của câu lệnh IF. Của bạn sẽ ném một ngoại lệ vì con có thể là NULL. Sau đó, bạn không cần toàn bộ thử bắt ở tất cả. – Switch

Các vấn đề liên quan