đâu để đóng một kết nối JDBC trong khi tôi muốn trở về ResultSet
Trên thực tế, bạn đã gần như tự trả lời câu hỏi đó. Như bạn đã thử nghiệm, việc đóng Connection
sẽ giải phóng các tài nguyên JDBC liên quan đến nó (ít nhất, đây là cách mọi thứ hoạt động). Vì vậy, nếu bạn muốn trả lại ResultSet
(Tôi sẽ quay lại sau này), bạn cần phải đóng kết nối "sau". Một cách để làm điều này sẽ rõ ràng để thông qua một kết nối đến phương pháp của bạn, một cái gì đó như thế này:
public ResultSet executeQuery(Connection conn, String sql, String[] getValue);
Vấn đề là tôi không thực sự biết mục tiêu cuối cùng của bạn là gì và tại sao bạn cần thứ cấp quá thấp vì vậy tôi không chắc đây là lời khuyên hay. Trừ khi nếu bạn đang viết một khuôn khổ JDBC mức thấp (và xin vui lòng, đừng nói với tôi bạn không làm điều này), tôi thực sự không khuyên bạn nên trả lại một ResultSet
. Ví dụ: nếu bạn muốn cấp một số lớp nghiệp vụ, hãy trả về một số đối tượng độc lập JDBC hoặc một bộ sưu tập chúng như những người khác đã khuyên thay vì một số ResultSet
. Cũng xin lưu ý rằng RowSet
là một ResultSet
vì vậy nếu bạn không nên sử dụng ResultSet
thì bạn không nên sử dụng RowSet
.
Cá nhân, tôi nghĩ bạn nên sử dụng một số lớp trợ giúp thay vì phát minh lại bánh xe. Trong khi mùa xuân có thể là quá mức cần thiết và có một chút đường cong học tập (quá nhiều nếu bạn không biết nó ở tất cả), mùa xuân không phải là cách duy nhất để đi và tôi khuyên bạn nên xem Commons DbUtils. Cụ thể hơn, nhìn vào QueryRunner
và đặc biệt là query()
phương pháp này:
public <T> T query(String sql,
ResultSetHandler<T> rsh,
Object... params)
throws SQLException
Như bạn có thể thấy, phương pháp này cho phép để vượt qua một ResultSetHandler
đó cho thấy một phương pháp gọi lại để chuyển đổi ResultSets
thành các đối tượng khác như mô tả trong z5h's answer và DbUtils cung cấp một số thực hiện, chỉ cần chọn một trong đó sẽ phù hợp với nhu cầu của bạn. Ngoài ra, hãy xem các phương thức tiện ích của lớp DbUtils
, ví dụ: DbUnit.close()
khác nhau mà bạn có thể thấy thuận tiện khi đóng tài nguyên JDBC.Thực sự, trừ khi bạn có lý do rất tốt để làm điều đó (và tôi rất tò mò muốn biết chúng), không viết thêm một khung công tác JDBC nào khác, sử dụng giải pháp hiện có, nó sẽ giúp bạn tiết kiệm một số đau đớn và hơn thế nữa quan trọng, một số lỗi và bạn sẽ được hưởng lợi từ thiết kế tốt đã được chứng minh. Ngay cả đối với các công cụ cấp thấp, vẫn có các giải pháp hiện có (và đơn giản) như chúng ta đã thấy. Ít nhất, hãy kiểm tra.
được bạn cố gắng để dòng ResultSet, ví dụ: tránh đơn giản là đọc tất cả các kết quả vào một số loại bộ sưu tập và trở về đó? –
Tắt chủ đề, tại sao mọi người lại sử dụng kiểu cú đúp đó? !!! Đây là Java không phải là C# – OscarRyz
Cảm ơn tất cả các bạn đã rất nhiệt tình! Gần như là buổi sáng ở Trung Quốc nhưng tôi cảm động vì bạn và những câu trả lời tuyệt vời của bạn về giấc ngủ. Đây là câu hỏi đầu tiên của tôi tại Stackoverflow.com. Tôi sẽ là người thường xuyên ở đây! – Aloong