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
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.
Dưới đây là so sánh tốt về hiệu suất với các giải pháp khác nhau. (PostgreSQL)
phiên bản ngắn: Nhìn một lúc pgBouncer
dài phiên bản: http://www.askthepony.com/blog/2011/07/django-and-postgresql-improving-the-performance-with-no-effort-and-no-code/
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
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.
- 1. Duy trì trạng thái trong máy chủ ứng dụng hoặc trong cơ sở dữ liệu?
- 2. duy trì lịch sử trong cơ sở dữ liệu
- 3. Làm thế nào để duy trì kết nối cơ sở dữ liệu trong ứng dụng ASP.NET MVC?
- 4. chuỗi kết nối cho máy chủ cơ sở dữ liệu từ xa
- 5. Cơ sở dữ liệu và kết nối
- 6. Làm thế nào để kết nối android với máy chủ cơ sở dữ liệu MySql?
- 7. kết nối với cơ sở dữ liệu derby với tomcat làm máy chủ
- 8. Truy cập dữ liệu trong cơ sở dữ liệu sản xuất nội bộ từ máy chủ web trong DMZ
- 9. Bảo mật thông tin kết nối cơ sở dữ liệu
- 10. Duy trì tính duy nhất của một thuộc tính trong cơ sở dữ liệu NDB
- 11. Cách tốt nhất để kết nối bảng tính với cơ sở dữ liệu web
- 12. kết nối có một cơ sở dữ liệu từ xa
- 13. Cách lấy chuỗi kết nối từ cơ sở dữ liệu
- 14. CakePHP Cách thay đổi kết nối cơ sở dữ liệu
- 15. cách kết nối F # với cơ sở dữ liệu MySQL?
- 16. Kết nối với hai cơ sở dữ liệu
- 17. jetty mysql kết nối cơ sở dữ liệu pooling
- 18. Hồ bơi kết nối cơ sở dữ liệu JBoss
- 19. Nhiều kết nối cơ sở dữ liệu trong Rails
- 20. kết nối cơ sở dữ liệu oracle trong web.config asp.net
- 21. Mở lại kết nối cơ sở dữ liệu trong Java
- 22. Duy trì tính toàn vẹn của lớp con trong cơ sở dữ liệu quan hệ
- 23. Khóa cơ sở dữ liệu máy chủ SQL với PHP
- 24. Sự khác biệt giữa máy chủ web, máy chủ ứng dụng và máy chủ cơ sở dữ liệu
- 25. Thông tin chuỗi kết nối cơ sở dữ liệu
- 26. Ưu tiên kết nối cơ sở dữ liệu PHP/MySQL?
- 27. Đang kết nối đến cơ sở dữ liệu Perl
- 28. Cách tạo nhiều kết nối cơ sở dữ liệu cho các cơ sở dữ liệu khác nhau trong java
- 29. Kết nối tối đa cho cơ sở dữ liệu sqlite3
- 30. Sự cố kết nối cơ sở dữ liệu SQL Azure - Quá nhiều kết nối?
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
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