2011-07-14 38 views
13

Tôi đang xem hướng dẫn Flask và gợi ý tạo kết nối cơ sở dữ liệu mới cho mỗi yêu cầu web. Có đúng cách để làm việc không? Tôi luôn nghĩ rằng kết nối cơ sở dữ liệu chỉ nên được tạo một lần cho mỗi luồng. Có thể được thực hiện, trong khi duy trì các ứng dụng như thread-an toàn, với bình, hoặc các máy chủ web python khác.Cách duy trì kết nối cơ sở dữ liệu trong máy chủ web python

Trả lời

11

Vì mục đích học tập có thể có. Nhưng trong một ứng dụng thực sự chạy trên một môi trường sản xuất không phải là một tình huống lý tưởng chút nào.

Thông thường, bạn sẽ luôn muốn có một hồ bơi kết nối giữa ứng dụng của bạn và cơ sở dữ liệu. Không có vấn đề gì ngôn ngữ/cơ sở dữ liệu bạn đang sử dụng này là một giải pháp phổ biến.

Hồ bơi kết nối cơ sở dữ liệu duy trì mở một số kết nối. Lớp ứng dụng đơn giản lấy một kết nối không được sử dụng, các kết nối sẽ được giải phóng khi lớp ứng dụng không cần chúng nữa. Bởi "phát hành" tôi có nghĩa là họ được trả lại hồ bơi để được sử dụng một lần nữa.

Điểm mấu chốt, các kết nối không mở/đóng theo yêu cầu. Họ nhận được/phát hành từ/đến hồ bơi kết nối cơ sở dữ liệu.

Ví dụ: với Python và mysql bạn có thể truy cập PySQLPool.

9

là tạo ra một kết nối mới mỗi yêu cầu con đường để đi? Không. Đối với các ứng dụng lớn, chúng tôi khuyên bạn nên sử dụng SQLAlchemy (có thể có hồ bơi kết nối được định cấu hình), ngay cả khi bạn không quan tâm đến ORM. Các tài liệu có một phần trên thực tế: http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer

+7

Tôi đang cố gắng tránh đường dẫn ORM, bởi vì nó bổ sung thêm một lớp trừu tượng, khi mọi thứ có thể dễ dàng được thực hiện trực tiếp. – Pankaj

+0

Có giải pháp đơn giản hơn hồ bơi kết nối không? Tôi có thể dễ dàng đủ khả năng để giữ một số kết nối mở. Tôi sẽ chỉ có một vài công nhân, do đó, một kết nối cho mỗi công nhân không phải là một vấn đề. – AlexC

0

Theo kinh nghiệm của tôi, thường là nên đóng các kết nối thường xuyên. Đặc biệt, MySQL thích đóng các kết nối đã không hoạt động trong một thời gian và đôi khi có thể khiến kết nối liên tục ở trạng thái cũ có thể khiến ứng dụng không phản hồi.

Điều bạn thực sự muốn làm là tối ưu hóa "thời gian kết nối đã chết", phần thời gian kết nối đã hết nhưng không thực hiện bất kỳ công việc nào. Trong trường hợp tạo một kết nối mới với mọi yêu cầu, thời gian chết đó thực sự chỉ là thời gian thiết lập và teardown. Nếu chỉ thực hiện một kết nối một lần (mỗi chủ đề), và nó không bao giờ xấu, thì thời gian chết là thời gian nhàn rỗi.

Khi ứng dụng của bạn chỉ phục vụ một vài yêu cầu, số lượng kết nối xảy ra cũng sẽ nhỏ và do đó không có nhiều thuận lợi trong việc giữ kết nối mở nhưng không hoạt động. Mặt khác, khi ứng dụng rất bận rộn, các kết nối hầu như không bao giờ nhàn rỗi và việc đóng kết nối sẽ được mở lại ngay lập tức cũng bị lãng phí. Ở giữa, khi các yêu cầu mới đôi khi tuân theo yêu cầu chuyến bay, nhưng đôi khi không, bạn sẽ phải thực hiện một số điều chỉnh hiệu suất về những thứ như kích thước hồ bơi, thời gian chờ yêu cầu, v.v.

Một ứng dụng rất bận rộn, sử dụng hồ bơi kết nối để giữ cho các kết nối mở sẽ chỉ thấy một loại thời gian chết; chờ đợi các yêu cầu sẽ không bao giờ quay trở lại vì kết nối đã xấu. Một giải pháp đơn giản cho vấn đề này là thực hiện một truy vấn tốt, được biết đến (trong MySQL được viết là SELECT 1) trước khi cung cấp kết nối từ pool tới yêu cầu và tái chế kết nối nếu nó không trả về nhanh.

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