【问题标题】:psycopg2 and infinite python scriptpsycopg2 和无限 python 脚本
【发布时间】:2018-05-25 08:52:49
【问题描述】:

我有一个用 Python 编写的无限脚本,它连接到 Postgresql 并在此人出现在连接到我计算机的摄像头前时插入一条记录。

我想知道连接(和存储连接)到数据库的最佳方式是什么,如果每次有人出现时都需要连接和关闭,或者我是否可以以某种方式存储连接。因为当我在无限循环之前创建连接并且相机前没有活动时,连接保持空闲,并且当脚本想要在一段时间后插入新行时,连接关闭。当我每次想插入新行的时候都连接,没有问题,但是这样比较慢。

感谢您的任何建议。

【问题讨论】:

  • 也许您需要将数据库连接配置为不超时 - 在此处查看 piro 的答案(并查看上面的 cmets)stackoverflow.com/questions/19963954/…
  • 人们多久会出现在您的相机前,表明这是一项对性能敏感的操作?您是否存储了每个非空视频帧?
  • 目前,我们正在我们的办公室进行测试,这意味着白天人们经常出现,并且在下午 6 点到早上 6 点之间有一个空白区域。在此时间之后,当一个新人出现时,数据库连接将关闭。是的,我正在存储每个非空视频帧。

标签: python postgresql psycopg2


【解决方案1】:

连接池非常适合这种事情。我没有在生产中使用它(主要使用 Django 或 SQLAlchemy),但psycopg2.pool 包含一些可能适合您需要的不同实现(SimpleConnectionPoolPersistentConnectionPool)。一般来说,池不仅有助于将连接作为共享资源进行管理,还可以在需要时测试和重新初始化连接。

from psycopg2 import pool
conn_pool = pool.PersistentConnectionPool(minconn, maxconn, **dbopts)

def work_method():
    conn = conn_pool.getconn()
    with conn.cursor() as stmt:
        stmt.execute(sql)
    conn_pool.putconn(conn)

putconn 非常重要,因此异常不会让池认为连接仍在使用中。作为上下文管理器处理它会很好:

import contextlib

@contextlib.contextmanager
def get_db_connection():
    conn = conn_pool.getconn()
    yield conn
    conn_pool.putconn(conn)

def work_method():
    with get_db_connection() as conn:
        with conn.cursor() as stmt:
            stmt.execute(sql)

希望对您有所帮助。

【讨论】:

  • 是的,我在考虑使用这种池。试试看,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2017-11-21
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多