2012-04-09 34 views
6

Tôi gặp vấn đề về hiệu năng với việc gọi hàm getInt bên trong một ResultSetExtractor. GetInt được gọi là 20000 lần. Một cuộc gọi tốn 0,15 ms, tổng chi phí là 24 giây, trong khi chạy bên trong profiler. Việc thực hiện các câu lệnh SQL mất khoảng 8 giây (truy cập qua Primary-Key). Tôi sử dụng trình điều khiển mysql phiên bản 5.1.13, máy chủ mysql 5.1.44 và spring-jdbc-3.1.1 Bạn có ý tưởng cải thiện hiệu suất không?Vấn đề về hiệu suất với getInt trong ResultSetExtractor

mut.getMutEffect()[0]=(rs.getInt("leffect_a") != 0); 
    mut.getMutEffect()[1]=(rs.getInt("leffect_c") != 0); 
    ... 
    mut.getMutEffect()[19]=(rs.getInt("leffect_y") != 0); 
    mut.getMutReliability()[0]=rs.getInt("lreliability_a"); 
    ... 
    mut.getMutReliability()[19]=rs.getInt("lreliability_y"); 

chương trình của tôi trông giống như

CREATE TABLE mutation (
... 
leffect_a BIT NOT NULL, 
lreliability_a TINYINT UNSIGNED NOT NULL, 
... 
leffect_y BIT NOT NULL, 
lreliability_y TINYINT UNSIGNED NOT NULL, 
... 
) ENGINE=MyISAM; 

Chỉnh sửa này: Trong vòng getInt tole getIntWithOverflowCheck được gọi mà dường như rất tốn kém. Có thể bật kiểm tra này không?

Trả lời

2

Dưới đây là một số gợi ý:

  • Set lấy kích thước để một số lượng khá lớn: Statement.setFetchSize(). Điều này sẽ làm giảm các chuyến đi khứ hồi đến máy chủ cơ sở dữ liệu trong khi xử lý resultset.

  • Đảm bảo báo cáo kết quả lựa chọn tối ưu bởi profiling

  • bảng chung tối ưu hóa, ví dụ bạn đang sử dụng đúng kiểu dữ liệu? Có vẻ như bạn có thể thay đổi leffect_a thành BOOLEAN

  • Đảm bảo bạn không trả lại bất kỳ cột nào không cần thiết trong câu lệnh SELECT.

  • Sử dụng PreparedStatement

  • Tránh resultsets cuộn và có thể cập nhật (không phải là mặc định)

+0

Statement.setFetchSize() hoạt động tốt. Cảm ơn rất nhiều. –

0

Hai gợi ý:

  1. Store kết quả của getMutEffect()getMutReliability() trong các biến địa phương khi chúng được sử dụng nhiều lần. Các hotspot jit có thể nội tuyến và loại bỏ các biểu thức trùng lặp nhưng tôi nghĩ rằng nó rõ ràng hơn để không dựa vào điều này.
  2. Có thể nhanh hơn để truy xuất các giá trị của ResultSet bằng cách sử dụng các chỉ số của chúng thay vì các tên cột. Bạn thậm chí có thể tạo ra một bản đồ địa phương của các tên để lập chỉ mục, kỳ lạ đối với một số trình điều khiển jdbc này là nhanh hơn cho phép ResultSet thực hiện ánh xạ.
+0

Cảm ơn cho câu trả lời. Trình lược tả cho thấy rằng nó rẻ để ánh xạ tên cột cho chỉ mục. Và cũng không có vấn đề về hiệu suất khi truy cập getMutEffect. –

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