PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool đã cạn kiệt

Tôi đã cố gắng tìm kiếm thông tin thực sự chi tiết về cách hoạt động của ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html không tệ, nhưng hóa ra tuyên bố rằng getconn chặn cho đến khi có kết nối là không chính xác. Kiểm tra mã, tất cả những gì ThreadedConnectionPool thêm vào là một khóa xung quanh các phương thức AbstractConnectionPool để ngăn chặn các điều kiện chủng tộc. Nếu có nhiều hơn maxconn kết nối được cố gắng sử dụng tại bất kỳ thời điểm nào, thì nhóm kết nối đã cạn kiệt PoolError sẽ được nâng lên.

Nếu bạn muốn điều gì đó đơn giản hơn một chút so với câu trả lời được chấp nhận, thì việc gói thêm các phương thức trong Semaphore cung cấp tính năng chặn cho đến khi có kết nối sẽ thực hiện thủ thuật:

from psycopg2.pool import ThreadedConnectionPool
from threading import Semaphore

class ReallyThreadedConnectionPool(ThreadedConnectionPool):
    def __init__(self, minconn, maxconn, *args, **kwargs):
        self._semaphore = Semaphore(maxconn)
        super().__init__(minconn, maxconn, *args, **kwargs)

    def getconn(self, *args, **kwargs):
        self._semaphore.acquire()
        return super().getconn(*args, **kwargs)

    def putconn(self, *args, **kwargs):
        super().putconn(*args, **kwargs)
        self._semaphore.release()


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để khôi phục dữ liệu từ vùng chứa Docker đã bị xóa? Làm thế nào để kết nối lại nó với dữ liệu?

  2. Ngoại lệ trong JPA khi sử dụng tệp hạt giống cho PostgreSQL

  3. Cách nâng cấp PostgreSQL10 lên PostgreSQL11 với Zero Downtime

  4. làm thế nào để sao chép dữ liệu từ tệp sang PostgreSQL bằng JDBC?

  5. Tên bảng JPA viết hoa