2013-07-19 28 views
14
while(result_set.next()) 
{ 
    ... 
} 

Tôi đã sử dụng System.nanoTime() và tính thời gian, cho mỗi lần lặp lại thời gian thực hiện bằng mili giây nhưng vòng lặp tổng thể mất khoảng 16 giây. Tôi đang xem xét một lý do có thể khiến kiểm tra điều kiện mất nhiều thời gian, chức năng next().Lặp lại một ResultSet bằng cách sử dụng JDBC cho Oracle mất rất nhiều thời gian khoảng 16 giây?

FYI Tôi đang kết nối với máy chủ cơ sở dữ liệu từ xa và truy vấn chọn mà tôi thực hiện được hoàn thành tính bằng mili giây một lần nữa được tính bằng phương pháp được đề cập ở trên. Bất kỳ lý do gì về lý do tại sao nó xảy ra và làm thế nào tôi có thể mang lại thời gian để lặp lại kết quả xuống tối đa một giây?

EDIT:

tôi đang đối phó với khoảng 4000 hồ sơ và mỗi bản ghi contians khoảng 10 cột mỗi có kích thước khoảng 10 chars

EDIT2 Cảm ơn setFetchsize() đã làm điều kỳ diệu, tuyệt vời, tuyệt vời

+1

Bạn nghĩ bạn có bao nhiêu hồ sơ? –

+1

Tập hợp kết quả chứa bao nhiêu bản ghi? Ngoài ra, nó sẽ rất hữu ích để hiểu nếu toàn bộ mã của vòng lặp while được cung cấp. – Mubin

+0

Hoặc bạn có nhiều bản ghi hoặc bạn có mạng chậm. Đừng đổ lỗi cho JDBC ở đây. – Kayaman

Trả lời

22

Cố gắng thay đổi kích thước tìm nạp ResultSet. Theo mặc định, trình điều khiển Oracle JDBC nhận kết quả chỉ đặt 10 hàng tại một thời điểm từ con trỏ cơ sở dữ liệu. Nó có thể không cải thiện đáng kể hiệu suất nhưng có nhiều tùy chọn khác để làm cho trình điều khiển hoạt động nhanh hơn.

+1

'Tôi không nghĩ rằng điều này sẽ cải thiện đáng kể hiệu suất' - tốt, nó có :-) xem câu trả lời của tôi dưới đây. Dù sao +1 cho câu trả lời đúng và tốt –

+0

@Andreas cool, +1, cố định câu trả lời của tôi –

28

Tôi đã thiết lập một bảng với 4000 hàng và 10 cột với 10 ký tự mỗi người và làm một bài kiểm tra hiệu suất đơn giản bằng cách sử dụng phương pháp sau đây (RealTimeCounter là một lớp học mà các biện pháp thời gian thực giữa start()stop()):

List<String> myResult = new ArrayList<>(); 
ResultSet rs = s.executeQuery("SELECT * FROM Performance"); 

RealTimeCounter rtc = new RealTimeCounter(); 
rtc.start(); 
while(rs.next()) { 
    myResult.add(rs.getString(1)); 
} 
rtc.stop(); 
System.out.println(rtc); 

Kết quả:

  • Mặc định lấy kích thước: thời gian thực hiện là khoảng. 20 giây
  • lấy size = 100: thời gian thực hiện là khoảng 2.2 giây
  • lấy size = 500: thời gian thực hiện là khoảng 450 msec
  • lấy size = 2000: thời gian thực hiện là khoảng 120 msec
  • lấy size = 4000: thời gian thực hiện là khoảng 50 msec
  • lấy size = 4001: thời gian thực hiện là khoảng 10 msec (!!)

Vì vậy, lấy kích thước không có một tác động đáng kể vào tốc độ thực hiện.


Lưu ý rằng, mặt khác, kích thước tìm nạp có tác động đến mức tiêu thụ bộ nhớ. Điều thú vị là, một phân tích nhanh bằng cách sử dụng Runtime.getRuntime().freeMemory(); trước và sau đoạn mã trên cho thấy rằng tác động là ít hơn nhiều so với tôi mong đợi, mặc dù.Các số liệu mà tôi có là:

  • Mặc định lấy kích thước: 665k
  • lấy size = 100: 665k
  • lấy size = 500: 665k
  • lấy size = 2000: 743k
  • lấy size = 4000: 821k
  • tìm nạp kích thước = 4001: 861k
+2

phân tích tuyệt vời – hershey92

+0

Điều đáng nói là khi tăng kích thước tìm nạp thường cải thiện tốc độ thực thi, nó cũng khiến chương trình của bạn sử dụng nhiều bộ nhớ hơn một sự cân bằng. Không có bữa trưa miễn phí ở đây. –

+0

@JohnRoberts điểm tốt - thú vị đủ, một phân tích nhanh chóng và bẩn của bộ nhớ tiêu thụ cho thấy rằng tác động là ít hơn nhiều hơn tôi mong đợi, mặc dù ... –

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