Để làm rõ - Node.js không đơn luồng. Mã ứng dụng của bạn được thực thi trong một chuỗi, nhưng ẩn nó sử dụng chúng khi cần thiết - hãy xem tại đây (cả câu trả lời và nhận xét bên dưới nó):
Và:
Như bạn có thể thấy mysql
mô-đun bạn sử dụng yêu cầu bạn chuyển một lệnh gọi lại cho query()
(và có thể là nhiều phương pháp khác). Vì vậy, khi bạn gọi nó, quá trình thực thi mã của bạn sẽ tiếp tục và lệnh gọi lại được gọi khi kết quả từ cơ sở dữ liệu đến.
Đối với câu hỏi của bạn - bạn không tạo kết nối mới cho mọi yêu cầu. Xem qua readme tệp của mysql
mô-đun, Kết nối tổng hợp phần
:
Khi bạn gọi dbPool.getConnection()
kết nối chỉ được tạo nếu không còn kết nối khả dụng nào trong nhóm - nếu không, nó chỉ lấy một kết nối từ trên cùng của nó. Đang gọi objConn.release()
giải phóng kết nối trở lại nhóm - nó không bị ngắt kết nối. Lệnh gọi này cho phép nó được sử dụng lại bởi các phần khác trong ứng dụng của bạn.
Tóm lại:
- Tạo kết nối mới cho mọi yêu cầu không phải là một ý kiến hay vì nó sẽ sử dụng nhiều tài nguyên hơn (CPU, RAM) trên cả máy ứng dụng và máy cơ sở dữ liệu của bạn.
- Việc sử dụng một kết nối cho tất cả các yêu cầu cũng không đúng vì nếu bất kỳ thao tác nào mất nhiều thời gian để hoàn thành kết nối của bạn sẽ bị treo khiến tất cả các yêu cầu khác phải chờ nó.
- Sử dụng nhóm kết nối là một ý tưởng tuyệt vời cho phép bạn thực hiện nhiều thao tác trên cơ sở dữ liệu của mình cùng lúc, ngay cả khi một trong số chúng mất nhiều thời gian để hoàn thành.
Cập nhật: Để trả lời các câu hỏi từ các bình luận:
Khi bạn đang sử dụng một kết nối cho mọi yêu cầu, mysql
mô-đun phải mở một ổ cắm mới, kết nối với cơ sở dữ liệu và xác thực trước khi bạn thực hiện truy vấn của mình - điều này mất thời gian và tiêu tốn một số tài nguyên. Vì đó, đó là một cách tiếp cận tồi.
Mặt khác, khi chỉ sử dụng một kết nối (không phải nhóm kết nối), việc chạy một truy vấn mất nhiều thời gian để hoàn thành sẽ chặn bất kỳ truy vấn nào khác trên kết nối đó cho đến khi hoàn thành - có nghĩa là bất kỳ yêu cầu nào khác sẽ phải đợi. Đó cũng là một cách tiếp cận không tốt.
Tạo một nhóm kết nối mới cho mọi yêu cầu cũng giống như sử dụng kết nối mới, trừ khi bạn gọi pool.getConnection()
nhiều lần - sau đó nó thậm chí còn tệ hơn (lấy tài nguyên được sử dụng bằng cách tạo một kết nối mới và nhân nó với số pool.getConnection()
cuộc gọi).
Để làm rõ thêm về một kết nối cho mỗi hoạt động so với tất cả các hoạt động trong một kết nối câu hỏi:
Mỗi hoạt động trong mọi kết nối được bắt đầu sau khi kết nối trước đó hoàn thành (nó đồng bộ, nhưng không phải ở phía máy khách), vì vậy nếu bạn có một bảng với vài tỷ hàng và hãy phát hành SELECT * FROM yourtable
sẽ mất một chút thời gian để hoàn thành, chặn mọi thao tác trên kết nối này cho đến khi hoàn tất.
Nếu bạn có một kết nối cho mỗi hoạt động cần được cấp song song (ví dụ:cho mọi yêu cầu) thì sự cố sẽ biến mất. Nhưng như đã nêu trước đây, việc mở một kết nối mới đòi hỏi thời gian và tài nguyên, đó là lý do tại sao nhóm kết nối khái niệm đã được giới thiệu.
Vì vậy, câu trả lời là: sử dụng một nhóm kết nối cho tất cả các yêu cầu (giống như bạn làm trong mã ví dụ của mình) - số lượng kết nối sẽ chia tỷ lệ tương ứng với lưu lượng truy cập trên ứng dụng của bạn.
Cập nhật # 2:
Dựa trên các nhận xét, tôi thấy rằng tôi cũng nên giải thích khái niệm đằng sau các nhóm kết nối. Cách hoạt động là bạn khởi động ứng dụng với nhóm kết nối trống và được khởi chạy để tạo tối đa n kết nối (afaik là 10 cho mysql
theo mặc định).
Bất cứ khi nào bạn gọi dbPool.getConnection()
nó sẽ kiểm tra xem có bất kỳ kết nối khả dụng nào trong pool không. Nếu có nó sẽ lấy một cái (làm cho nó không khả dụng), nếu không nó sẽ tạo một cái mới. Nếu đạt đến giới hạn kết nối và không có kết nối khả dụng, một số loại ngoại lệ sẽ được nâng lên.
Đang gọi connection.release()
giải phóng kết nối trở lại nhóm để nó khả dụng trở lại.
Sử dụng nhóm để chỉ có một kết nối toàn cầu cho toàn bộ ứng dụng là hoàn toàn sai và đi ngược lại chính khái niệm này (bạn có thể làm điều tương tự bằng cách tạo kết nối theo cách thủ công), vì vậy hãy sử dụng nhóm kết nối Ý tôi là sử dụng nhóm kết nối như nó được cho là được sử dụng - để nhận kết nối từ nó khi bạn cần .