2009-07-25 41 views
5

Kiến trúc là cách tốt nhất để xử lý JDBC với nhiều luồng là gì? Tôi có nhiều chủ đề đồng thời truy cập cơ sở dữ liệu. Với một kết nối và tuyên bố đơn lẻ, tôi nhận được thông báo lỗi sau:JDBC đa luồng

org.postgresql.util.PSQLException: ResultSet này bị đóng.

Tôi có nên sử dụng nhiều kết nối, nhiều câu hoặc có phương pháp tốt hơn không? Suy nghĩ sơ bộ của tôi là sử dụng một câu lệnh cho mỗi luồng sẽ đảm bảo một tập hợp kết quả duy nhất cho mỗi câu lệnh.

Trả lời

4

Bạn nên sử dụng một kết nối cho mỗi tác vụ. Nếu bạn sử dụng kết nối tổng hợp, bạn không thể sử dụng các câu lệnh chuẩn bị được chuẩn bị bởi một số kết nối khác. Tất cả các đối tượng được tạo ra bởi kết nối (ResultSet, PreparedStatements) đều không hợp lệ để sử dụng sau khi kết nối được trả về pool.

Vì vậy, nó là như nhau

public void getSomeData() { 
    Connection conn = datasource.getConnection(); 
    PreparedStatement st; 
    try { 
    st = conn.prepareStatement(...); 
    st.execute(); 
    } finally { 
    close(st); 
    close(conn); 
    } 
} 

Vì vậy, trong trường hợp này tất cả các đối tượng DAO của bạn mất không kết nối, nhưng DataSource đối tượng (java.sql.DataSource) là nhà máy kết nối poolable thực sự. Và trong mỗi phương pháp đầu tiên bạn có được kết nối, làm tất cả công việc của bạn và kết nối chặt chẽ. Bạn nên trả lại kết nối với nhóm càng nhanh càng tốt. Sau khi kết nối trả lại, nó có thể không được đóng lại, nhưng được khởi động lại (tất cả các giao dịch đang hoạt động đóng, tất cả các biến phiên bị phá hủy, vv)

1

Có, sử dụng nhiều kết nối với một hồ bơi kết nối. Mở kết nối chỉ đủ lâu để thực hiện những gì bạn cần, sau đó đóng kết nối ngay khi bạn hoàn tất. Hãy để hồ bơi kết nối quản lý việc quản lý kết nối "vật lý" cho hiệu quả.