2012-05-10 34 views
5

Tôi làm việc với Oracle và Mysql, và tôi cố gắng hiểu tại sao các API không được viết như vậy mà tôi có thể thực hiện cuộc gọi, bỏ đi và làm điều gì đó khác, và sau đó quay lại và nhặt nó lên sau, ví dụ NIO - Tôi bị ép buộc để dành một chủ đề để chờ dữ liệu. Dường như các giao diện SQL là nơi duy nhất mà IO đồng bộ vẫn bị ép buộc, điều đó có nghĩa là buộc một luồng đang đợi DB.Tại sao các nhà cung cấp DB lớn không cung cấp các API không đồng bộ thực sự?

Ai đó có thể giải thích lý do cho điều này không? Có điều gì cơ bản khiến việc này khó khăn không?

Thật tuyệt vời khi có thể sử dụng 1-2 luồng để quản lý vấn đề truy vấn DB của tôi và tìm nạp kết quả, thay vì sử dụng chuỗi công việc để truy xuất dữ liệu.

Tôi lưu ý rằng có hai lần thử nghiệm (ví dụ: adbcj) khi triển khai API async nhưng dường như không có sẵn sàng cho việc sử dụng Sản xuất.

+0

Tôi cũng rất ngạc nhiên về điều này. –

Trả lời

1

Máy chủ cơ sở dữ liệu có thể xử lý hàng nghìn ứng dụng khách. Để cung cấp một giao diện không đồng bộ, máy chủ DB sẽ cần phải giữ kết quả từ truy vấn trong bộ nhớ, vì vậy bạn có thể chọn nó ở giai đoạn sau. Nó sẽ nhanh chóng trở thành nguồn tài nguyên.

+1

Tôi thấy quan điểm của bạn, đến một mức độ nào đó - mặc dù điều này vẫn xảy ra; tìm nạp các kết quả lớn thường không lấy toàn bộ kết quả trong một lần. – jasonk

1

Một vấn đề đáng kể với async là nhiều thư viện sử dụng threadlocal cho giao dịch.

Ví dụ trong Java Phần lớn đặc tả JDBC dựa trên hành vi đồng bộ để đạt được một luồng cho mỗi giao dịch. Đó là bạn viết giao dịch của bạn theo thứ tự thủ tục.

Để thực hiện các giao dịch phù hợp sẽ phải thực hiện thông qua gọi lại nhưng không được thực hiện. Tôi biết chỉ có node.js thực hiện điều này nhưng nó không rõ ràng nếu nó thực sự không đồng bộ.

Tất nhiên ngay cả khi bạn làm async tôi không chắc chắn nếu nó thực sự sẽ cải thiện hiệu suất như cơ sở dữ liệu chính nó nếu có thể làm nó đồng bộ.

Có rất nhiều cách để tránh chủ đề quá dân số (Java): Is asynchronous jdbc call possible?

Cá nhân để có được xung quanh vấn đề này, tôi sử dụng một xe buýt nhắn như RabbitMQ.

Các vấn đề liên quan