2009-05-11 36 views
12

Tôi đang cố gắng xác định cách tốt nhất để ping cơ sở dữ liệu qua JDBC. Bởi 'tốt nhất' tôi có nghĩa là chi phí nhanh và thấp. Ví dụ: tôi đã xem xét việc thực hiện điều này:Cách tốt nhất để 'ping' một cơ sở dữ liệu thông qua JDBC là gì?

"SELECT 1 FROM DUAL" 

nhưng tôi tin rằng bảng DUAL là đặc thù của Oracle và tôi cần một cái gì đó chung chung hơn.

Lưu ý rằng Connection có phương thức isClosed(), nhưng javadoc tuyên bố rằng điều này không thể được sử dụng để kiểm tra tính hợp lệ của kết nối.

+0

(Tôi đã sử dụng 'SELECT @@ VERSION' trên MS SQL Server, nhưng đó không phải là SQL.) –

Trả lời

5

Có, đó sẽ là chỉ Oracle, nhưng không có cách nào chung để làm điều này trong JDBC.

Hầu hết việc triển khai pool kết nối đều có tham số cấu hình nơi bạn có thể chỉ định SQL sẽ được sử dụng cho ping, do đó đẩy trách nhiệm để tìm ra cách thực hiện nó cho người dùng.

Đó có vẻ như là cách tiếp cận tốt nhất trừ khi ai đó đi kèm với một công cụ trợ giúp ít cho việc này (tất nhiên, nó ngăn cản sử dụng phương pháp có khả năng thậm chí nhanh hơn không dựa trên SQL như Oracle's internal ping function)

+3

CHỌN 1 TỪ DUAL hoạt động với MySQL cũng vậy. – Joset

+3

Xem câu trả lời của tôi, JDBC 4 có một cách chung chung (nguyên nhân không phải tất cả các trình điều khiển đều cung cấp JDBC 4). – eckes

1

tôi có thể ra ngoài ăn trưa một ngày này, nhưng có thể bạn chỉ cần thực hiện một số truy vấn phi nghĩa nào đó, chẳng hạn như:

SELECT * FROM donkey_giraffe_87 

tôi không biết rất nhiều về xử lý lỗi JDBC, nhưng có lẽ bạn có thể kiểm tra xem cơ sở dữ liệu là ít nhất nói với bạn rằng bảng không tồn tại. Nếu các mã lỗi của JDBC là nhà cung cấp cụ thể, thì Spring Framework có một số tiện ích để ánh xạ các mã này tới các ngoại lệ có ý nghĩa hơn.

+0

Có thể tốn kém để thử truy vấn một bảng không có sẵn. Lỗi bộ nhớ cache từ điển và mã xử lý lỗi. – Thilo

4

Tôi cũng không biết về giải pháp chung. Đối với UDB của IBM trên iSeries (và hệ thống DB2 có lẽ khác) nó sẽ là

select 1 from SYSIBM.SYSDUMMY1; 
0

Đơn giản chỉ cần ban hành các truy vấn sau đây nên là đủ

SELECT 1 
+0

sẽ không hoạt động với Oracle ... – Thilo

+2

ORA-00923: TỪ từ khóa không tìm thấy ở đâu được mong đợi – Thilo

0

Bạn có thể không chỉ đơn giản thực hiện

SELECT 1 

không một mệnh đề FROM đối với hầu hết các cơ sở dữ liệu?

+3

Không phải với Oracle: ORA-00923: TỪ từ khóa không được tìm thấy ở nơi được mong đợi – Thilo

3

Bạn có thể thử lấy tên db từ dữ liệu meta kết nối và thực hiện lệnh ghép nối sql phù hợp. Ví dụ.

Connection con = null; 
Statement st = null; 
ResultSet rs = null; 
try { 
    con = dataSource.getConnection(); 
    String dbProductName = con.getMetaData().getDatabaseProductName(); 
    Statement st = con.createStatement(); 
    if ("PostgreSQL".equalsIgnoreCase(dbProductName)) { 
    rs = st.executeQuery("select version();"); 
    } else if ("Oracle".equalsIgnoreCase(dbProductName)) { 
    rs = st.executeQuery("select 1 from dual"); 
    } else { 
    ... 
    } 
} catch (Exception ex) { 
    System.out.prinln("DB not reachable"); 
} finally { 
    // close statement, connection etc. 
    ... 
} 
10

Với JDBC 4 bạn có thể sử dụng isValid(int) (JavaDoc) từ Giao diện kết nối. Điều này về cơ bản có tuyên bố dùng thử cho bạn.

1

MySQL có cơ chế đẹp, được ghi lại trong số SO answer này. Từ câu trả lời:

"/* ping */ SELECT 1" 

Điều này thực sự sẽ làm cho tài xế gửi một ping đến máy chủ và trả về một giả, trọng lượng nhẹ, tập hợp kết quả.

Có nói rằng, @eckes answer là tốt nhất (sử dụng sốcủa JDBC 4).

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