Bạn không sử dụng cùng một PreparedStatement , phương thức gốc Connection.prepareStatement đang trả lại cho bạn một phiên bản mới mỗi khi bạn gọi nó. PreparedStatement.executeQuery đang làm tương tự với ResultSet . Bạn chỉ đang sử dụng các biến giống nhau.
Điều này có nghĩa là bạn đang làm rò rỉ tài nguyên - PreparedStatement đầu tiên và ResultSet - mỗi khi phương thức này được gọi, phương thức này sẽ không bao giờ được đóng.
Đề xuất của tôi là sử dụng JdbcTemplate của Spring sẽ xử lý các tài nguyên cơ sở dữ liệu này một cách chính xác cho bạn và bạn chia mã của mình thành hai phương pháp.