Tôi đã có cùng vấn đề y hệt. Tôi cần giữ 1 kết nối hoạt động cho 3 luồng và đồng thời mỗi luồng phải thực hiện rất nhiều câu lệnh (thứ tự 100k). Tôi đã rất cẩn thận và tôi đã đóng mọi câu lệnh và mọi tập kết quả bằng cách sử dụng thuật toán thử .... cuối cùng .... Bằng cách này, ngay cả khi mã không thành công theo một cách nào đó, câu lệnh và tập kết quả luôn đóng. Sau khi chạy mã trong 8 giờ, tôi đã rất ngạc nhiên khi thấy rằng bộ nhớ cần thiết đã tăng từ 35MB ban đầu lên 500MB. Tôi đã tạo một kết xuất bộ nhớ và tôi phân tích nó bằng Mat Analyzer từ Eclipse. Hóa ra là một đối tượng com.mysql.jdbc.JDBC4Connection đang chiếm 445 MB bộ nhớ để giữ cho một số đối tượng openStatements tồn tại và lần lượt giữ nguyên 135k mục nhập hashmap, có thể là từ tất cả các tập kết quả. Vì vậy, có vẻ như ngay cả khi bạn đóng tất cả các câu lệnh và tập kết quả của mình, nếu bạn không đóng kết nối, nó sẽ giữ các tham chiếu đến chúng và GarbageCollector không thể giải phóng tài nguyên.
Giải pháp của tôi :sau một thời gian dài tìm kiếm, tôi đã tìm thấy câu nói này từ những người ở MySQL:
"Kiểm tra nhanh là thêm" dontTrackOpenResources =true "tới URL JDBC của bạn. Nếu bộ nhớ bị rò rỉ, một số đường dẫn mã trong ứng dụng của bạn không đóng các câu lệnh và bộ kết quả."
Đây là liên kết: http://bugs.mysql.com/bug.php? id =5022
. Vì vậy, tôi đã thử điều đó và đoán xem? Sau 8 giờ, tôi cần khoảng 40MB bộ nhớ cho các hoạt động cơ sở dữ liệu tương tự.