Vấn đề là với cách bạn tìm nạp dữ liệu trong getStuff()
. Mỗi lần bạn truy cập getStuff()
bạn nhận được ResultSet
mới nhưng bạn không đóng nó.
Điều này vi phạm kỳ vọng của Statement
lớp (xem tại đây - http:// docs. oracle.com/javase/7/docs/api/java/sql/Statement.html
):
Theo mặc định, chỉ có thể mở một đối tượng ResultSet cho mỗi đối tượng Statement. Do đó, nếu việc đọc của một đối tượng ResultSet được xen kẽ với việc đọc của đối tượng khác, thì mỗi đối tượng phải được tạo ra bởi các đối tượng Statement khác nhau. Tất cả các phương thức thực thi trong giao diện Statement sẽ đóng một cách ngầm định đối tượng ResultSet hiện tại của một trạng thái nếu tồn tại một đối tượng đang mở.
Điều khiến mọi thứ thậm chí còn tồi tệ hơn là rs
từ mã gọi điện. Nó cũng có nguồn gốc từ câu lệnh statement
trường nhưng nó không bị đóng.
Điểm mấu chốt:bạn có một số ResultSet
liên quan đến cùng một Statement
đối tượng được mở đồng thời.