2008-10-02 25 views
23

Tôi đã thực thi truy vấn JDBC để có được một kết quả. Trước khi lặp lại nó, tôi muốn nhanh chóng tìm ra có bao nhiêu hàng được trả về. Làm thế nào tôi có thể làm điều này với hiệu suất cao?Làm cách nào để nhận số hàng trong JDBC?

Tôi đang sử dụng Java 6, Oracle 11g và trình điều khiển JDBC Oracle mới nhất.

Trả lời

26

Bạn sẽ phải làm điều này như một truy vấn riêng biệt, ví dụ:

SELECT COUNT(1) FROM table_name 

Một số trình điều khiển JDBC có thể nói với bạn nhưng đây là hành vi không bắt buộc và, nhiều đến mức, người lái xe có thể không biết chưa. Điều này có thể là do cách truy vấn được tối ưu hóa, ví dụ như hai chiến lược thực hiện ví dụ trong Oracle là lấy tất cả các hàng càng nhanh càng tốt hoặc để có được hàng đầu tiên càng nhanh càng tốt.

Nếu bạn thực hiện hai truy vấn riêng biệt (một truy vấn và một truy vấn khác) thì bạn sẽ cần phải thực hiện chúng trong cùng một giao dịch. Điều này sẽ làm việc tốt trên Oracle nhưng có thể có vấn đề trên các cơ sở dữ liệu khác (ví dụ SQL Server sẽ hiển thị cho bạn dữ liệu không được cam kết hoặc chặn trên một bản cập nhật không được cam kết bên ngoài tùy thuộc vào mức cô lập của bạn trong khi Oracle hỗ trợ một mức cô lập mang lại cho bạn một giao diện nhất quán về giao dịch dữ liệu mà không bị chặn trên các cập nhật bên ngoài).

Thông thường mặc dù nó không thực sự quan trọng có bao nhiêu hàng. Thông thường, loại truy vấn này là một trong hai lô được xử lý hoặc phân trang và theo cách bạn có thông tin tiến trình ở dạng hàng được tải/xử lý và bạn có thể phát hiện kết thúc của tập kết quả (hiển nhiên).

+0

Tốt câu trả lời, mặc dù tôi không hiểu bình luận chính thức về việc có thông tin tiến bộ. Cái này đến từ đâu? – Aktau

+0

Điều này yêu cầu một truy vấn khác. Nếu bạn có một kết quả có thể cuộn được thì có các tùy chọn tốt hơn trong các câu trả lời khác. – JDuarteDJ

18

Câu trả lời ngắn gọn: bạn không thể.

Câu trả lời dài: bạn không thể, một phần vì cơ sở dữ liệu có thể đang đánh giá một cách lười biếng truy vấn, chỉ trả về các hàng khi bạn yêu cầu.

EDIT: Sử dụng một ResultSet cuộn bạn có thể :)

Thật vậy, tôi hỏi câu hỏi rất này trong Java sở dữ liệu nhóm tin một thời gian dài trước (trở lại vào năm 2001!) Và đã có một số helpful responses.

4

Nếu trình điều khiển của bạn hỗ trợ nó (!), Bạn có thể gọi ResultSet.afterLast() ResultSet.getRow() ResultSet.beforeFirst(). Hiệu suất có thể hoặc có thể không tốt.

Giải pháp tốt hơn là viết lại thuật toán của bạn để không yêu cầu kích thước lên phía trước.

15
ResultSet rs = stmt.executeQuery(sql); 
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :) 
+4

Hoạt động tốt. Bạn nên thêm rằng bạn cần một tập kết quả có thể cuộn cho điều này. –

+0

Hỗ trợ bình luận trước đó cộng với tôi nghĩ rằng điều này nên là câu trả lời đúng, vì nó cung cấp một cách ngắn hơn và nhiều hơn nữa để làm điều đó! – JDuarteDJ

+0

Tính năng này hoạt động như thế nào? – Winter

0

Code:

//Create a Statement class to execute the SQL statement 
Statement stmt = con.createStatement(); 

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM 
TABLENAME"); 

while(rs.next()) { 
    System.out.println("The count is " + rs.getInt("COUNT")); 
} 

//Closing the connection 
con.close(); 
+0

Đây phải là câu trả lời. Hoạt động hoàn hảo. –

+1

Câu hỏi đặt ra là có bao nhiêu hàng trong resultset. Không đếm hàng của bảng – ernesto

10

Để có được số lượng hàng từ JDBC:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME"); 
rs.next(); 
int count = rs.getInt(1); 
+3

không có ai hỏi có bao nhiêu hàng trong một bảng, câu hỏi là về số lượng hàng trong resultset. – ernesto

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