2012-04-03 31 views
8

Tôi đang đọc về kết nối của SQLAlchemy, có mặc định là 5 kết nối và sẽ mặc định tràn đến 10.Điều gì xảy ra khi một hồ bơi kết nối bị cạn kiệt?

Nếu số lượng kết nối được lưu trong bộ nhớ cache bị vượt quá, điều gì sẽ xảy ra? Các yêu cầu tiếp theo có được xếp hàng đợi cho đến khi kết nối miễn phí khả dụng hoặc sẽ có kết nối mới không được tạo ra trong hồ bơi không?

Ngoài ra, điều gì sẽ xảy ra với các kết nối không được sử dụng khi hồ bơi đã "tràn" đến tối đa mặc định là 10? Những kết nối đó có ngắt kết nối sau thời gian mặc định (như với hồ bơi tiêu chuẩn) hay chúng được phát hành mạnh hơn so với hồ bơi tiêu chuẩn không?

Trả lời

13

Bạn đang đọc về QueuePool, quản lý kết nối cơ sở dữ liệu để có hiệu suất tốt hơn. Nó thực hiện điều này bằng cách giữ các kết nối không hoạt động mở, trong trường hợp bạn muốn sử dụng lại chúng sau này. Số lượng kết nối nó sẽ giữ mở là pool_size = 5 (mặc định). Nếu bạn mở kết nối thứ sáu, một trong các kết nối trong hàng đợi sẽ bị đóng, miễn là nó không hoạt động. Nếu không có chế độ chờ nào, QueuePool sẽ mở thêm hàng đợi, tối đa max_overflow = 10 (mặc định). Còn nữa và bạn sẽ gặp lỗi. Tuy nhiên cả hai tham số này đều có thể cấu hình được. Đặt pool_size = 0 để có kết nối mở không giới hạn. The source is here

+0

pool_size = -1 không giới hạn. – zzzeek

+1

hmm, trong liên kết tới tài liệu, hãy xem QueuePool .__ init__, docstring nói "' 'pool_size'' có thể được đặt thành 0 để cho biết không có giới hạn kích thước" –

+0

oh bạn đúng Tôi đã xem pool_recycle – zzzeek

4

mỗi SQLAlchemy docs,

Khi số lượng kết nối check-out đạt kích thước đặt trong pool_size, kết nối bổ sung sẽ được trả lại lên đến giới hạn này. Khi các kết nối bổ sung đó được trả về hồ bơi, chúng sẽ bị ngắt kết nối và loại bỏ. Sau đó, tổng số kết nối đồng thời mà hồ bơi sẽ cho phép là pool_size + max_overflow và tổng số lượng kết nối “ngủ” mà hồ bơi sẽ cho phép là pool_size.

Vì vậy, có, các kết nối tràn được giải phóng mạnh hơn các kết nối thông thường ngủ.

Nếu bạn thực sự xem các nguồn của QueuePool._do_get(), bạn sẽ thấy rằng nó tăng TimeoutError khi kết nối đếm bằng kích thước hồ bơi + tràn và không có kết nối nào được trả về hồ ngay sau khi connect() được gọi.

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