Có, nói chung, bạn cần tạo kết nối mới cho mỗi chuỗi. Bạn không có quyền kiểm soát cách hệ điều hành thời gian thực hiện các luồng (mặc dù định nghĩa các phần quan trọng của riêng bạn), vì vậy bạn vô tình có thể có nhiều luồng cố gắng gửi dữ liệu xuống một đường ống đó.
Lưu ý điều tương tự cũng áp dụng cho bất kỳ liên lạc mạng nào. Ví dụ: nếu bạn có hai chủ đề cố gắng chia sẻ một ổ cắm với kết nối HTTP.
- Chủ đề 1 tạo ra một yêu cầu
- Chủ đề 2 tạo ra một yêu cầu
- Chủ đề 1 lần đọc byte từ các ổ cắm, vô tình đọc phản hồi từ chủ đề 2 của yêu cầu
Nếu bạn bọc tất cả các giao dịch của bạn trong các phần quan trọng, và do đó khóa bất kỳ chủ đề khác cho toàn bộ chu kỳ bắt đầu/cam kết, sau đó bạn có thể chia sẻ kết nối cơ sở dữ liệu giữa các luồng. Nhưng tôi sẽ không làm điều đó ngay cả khi đó, trừ khi bạn thực sự có kiến thức bẩm sinh về giao thức JDBC.
Nếu hầu hết các chủ đề của bạn không cần thiết cho kết nối cơ sở dữ liệu (hoặc không cần chút nào), bạn có thể chỉ định một luồng để thực hiện công việc cơ sở dữ liệu của mình và yêu cầu các luồng khác xếp hàng yêu cầu của chúng vào chuỗi đó. Điều đó sẽ làm giảm chi phí của rất nhiều kết nối. Nhưng bạn sẽ phải tìm ra cách quản lý các kết nối cho mỗi luồng trong môi trường của bạn (hoặc hỏi một câu hỏi cụ thể khác về điều đó trên StackOverflow).
update: Để trả lời câu hỏi của bạn trong các bình luận, hầu hết các nhãn hiệu cơ sở dữ liệu không hỗ trợ nhiều giao dịch đồng thời trên một kết nối duy nhất (Interbase/Firebird là ngoại lệ duy nhất tôi biết).
Thật tuyệt khi có một đối tượng giao dịch riêng biệt và có thể bắt đầu và thực hiện nhiều giao dịch cho mỗi kết nối. Nhưng các nhà cung cấp chỉ đơn giản là không hỗ trợ nó.
Tương tự, các API độc lập của nhà cung cấp tiêu chuẩn như JDBC và ODBC đưa ra giả định tương tự, trạng thái giao dịch chỉ đơn thuần là thuộc tính của đối tượng kết nối.
Nguồn
2008-11-14 02:17:49
Ok ... Chỉ bằng sự tò mò, bạn có biết tại sao định nghĩa của giao dịch được kết hợp với định nghĩa kết nối trên JDBC không? Tôi thực sự đánh giá cao một đối tượng giao dịch. – fulmicoton
Cảm ơn bạn rất nhiều vì câu trả lời của bạn !!! – fulmicoton
Tuyên bố "bạn vô tình có thể có nhiều chủ đề cố gắng gửi dữ liệu xuống một đường ống" trong câu trả lời này là hoàn toàn sai cho postgresql. Xem http://doc.postgresintl.com/jdbc/ch10.html. Kết nối ít nhất là an toàn, mặc dù không hoàn toàn song song vì nó có thể. –