8

Ứng dụng của tôi thực hiện nhiều truy vấn trong nhiều chuỗi.Đa luồng với Apache DBCP

Hiện tại tôi đang tạo kết nối mới cho mọi truy vấn và tôi muốn sử dụng hồ bơi để cải thiện hiệu quả.

Hồ bơi DBCP Apache có thể làm việc trong nhiều luồng cùng lúc hay không, hoặc nó sẽ "chặn" trên một số phương thức được đồng bộ cho mỗi chuỗi?

Nếu nó chặn, tôi có thể sử dụng cái gì khác không?

CẬP NHẬT

Trong bài viết này: link nói:

Bởi vì tất cả các phương pháp Oracle JDBC API được đồng bộ hóa, nếu hai luồng cố gắng sử dụng các đối tượng kết nối cùng một lúc, sau đó người ta sẽ buộc phải đợi cho đến khi người kia kết thúc việc sử dụng nó.

Vì vậy, tôi đoán DBCP sẽ không thể giải quyết vấn đề đó?

Tôi cũng nhận ra rằng trong trường hợp này, nhóm sẽ không giúp tôi, vì mỗi luồng sẽ yêu cầu kết nối và chuỗi sẽ tạo kết nối mới mỗi lần (cho đến khi một số chuỗi kết thúc và trả về kết nối hồ bơi)

+1

Để bổ sung các câu trả lời tuyệt vời bên dưới, thời gian duy nhất 'getConnection()' có thể chặn là nếu bạn không có 'Connection' trong hồ bơi của bạn (nghĩa là: tất cả chúng đều đang thực hiện các giao dịch với cơ sở dữ liệu của bạn). Nhưng ngay sau khi một giao dịch kết thúc, 'Connection' sẽ được trả về hồ bơi của bạn và' getConnection() 'sẽ trả về một cá thể' Connection' hợp lệ. Mặc dù tất cả điều này sẽ phụ thuộc vào cấu hình của hồ bơi của bạn. – Jeach

Trả lời

2

Có, Apache DBCP có thể hoạt động đồng thời nhiều luồng. "chặn" xảy ra khi mã máy khách getConnection() để đảm bảo hành vi chính xác trong điều kiện chủng tộc, ví dụ: một trường hợp Connection không được nhận bởi hai yêu cầu getConnection() đồng thời. Sau khi mã khách hàng đó xử lý các trường hợp Connection.

Kịch bản đồng thời là mối quan tâm chính về tổng hợp phía máy chủ, chẳng hạn như Apache DBCP phổ biến. Vì vậy, tôi nghĩ rằng DBCP làm tốt hành vi trong đa luồng, mặc dù tôi không đi sâu vào thư viện sâu.

Và DBCP của Apache chỉ cung cấp kết nối JDBC tổng hợp, mã khách hàng phải sử dụng các trường hợp Connection theo cách đa chủ đề chính xác mà DBCP không thể đảm bảo.

+0

Tôi không chắc chắn nếu tôi đúng, nhưng tôi nghĩ rằng một số phương pháp của PreparedStatement rằng trả về kết nối được đồng bộ hóa. Nếu vậy, kết nối sẽ chặn cho mỗi chủ đề ... – user1658192

+0

Tôi không tìm thấy bất kỳ phương thức nào trong 'Kết nối' hoặc 'Sao kê' được đồng bộ trong JDBC. –

+0

Vì vậy, không có vấn đề bằng cách sử dụng cùng một kết nối trong nhiều chủ đề, trong đó mỗi tread sẽ thực hiện truy vấn khác nhau? – user1658192

4

Chủ đề có kết nối từ hồ bơi và sử dụng độc quyền cho đến khi hoàn thành, nó không chia sẻ kết nối với các chủ đề khác. Khi nó được thực hiện, nó trả về kết nối tới pool (thường là kết nối sẽ ghi đè phương thức đóng để trả nó về pool). Lợi ích là các kết nối không phải được tái tạo cho mỗi lần sử dụng. Nhưng bạn không nên có nhiều luồng để sử dụng đồng thời kết nối cơ sở dữ liệu.

+0

Tôi muốn tránh tạo kết nối cho mỗi chủ đề để cải thiện hiệu quả. Ngay bây giờ mỗi thread tạo kết nối riêng của nó. – user1658192

+0

@ user1658192 tại sao không gọi getConnection() từ nguồn dữ liệu DBCP thay vì chia sẻ cá thể Kết nối? –

+0

điều gì sẽ xảy ra khi tôi gọi getConnection(), trong khi kết nối tương tự đã được sử dụng bởi chủ đề khác? Cuộc thăm dò sẽ tạo ra một kết nối mới? – user1658192