What is the best solution for database connection pooling in python?

前端 未结 8 1560
青春惊慌失措
青春惊慌失措 2020-11-28 23:09

I have developed some custom DAO-like classes to meet some very specialized requirements for my project that is a server-side process that does not run inside any kind of fr

8条回答
  •  一整个雨季
    2020-11-28 23:24

    Old thread, but for general-purpose pooling (connections or any expensive object), I use something like:

    def pool(ctor, limit=None):
        local_pool = multiprocessing.Queue()
        n = multiprocesing.Value('i', 0)
        @contextlib.contextmanager
        def pooled(ctor=ctor, lpool=local_pool, n=n):
            # block iff at limit
            try: i = lpool.get(limit and n.value >= limit)
            except multiprocessing.queues.Empty:
                n.value += 1
                i = ctor()
            yield i
            lpool.put(i)
        return pooled
    

    Which constructs lazily, has an optional limit, and should generalize to any use case I can think of. Of course, this assumes that you really need the pooling of whatever resource, which you may not for many modern SQL-likes. Usage:

    # in main:
    my_pool = pool(lambda: do_something())
    # in thread:
    with my_pool() as my_obj:
        my_obj.do_something()
    

    This does assume that whatever object ctor creates has an appropriate destructor if needed (some servers don't kill connection objects unless they are closed explicitly).

提交回复
热议问题