首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确保psycopg2数据库连接处于活动状态

确保psycopg2数据库连接处于活动状态
EN

Stack Overflow用户
提问于 2009-08-15 13:17:09
回答 3查看 54.1K关注 0票数 43

我有一个python应用程序,它打开一个数据库连接,它可以在线挂起几个小时,但有时数据库服务器会重新启动,虽然python仍然有连接,但它不会在OperationalError异常情况下工作。

因此,我正在寻找任何可靠的方法来"ping“数据库,并知道连接是活动的。我查看了psycopg2文档,但找不到任何类似的内容。当然,我可以发出一些简单的SQL语句(如SELECT 1 )并捕获异常,但我希望有一个本机方法,如PHP pg_connection_status

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-15 14:36:09

pg_connection_status是使用PQstatus实现的。expose不会公开该API,因此检查不可用。只有两个地方可以调用PQstatus本身,一个是在建立新连接的时候,另一个是在开始执行的时候。所以,是的,您将需要发出一条简单的SQL语句来确定连接是否仍然存在。

票数 25
EN

Stack Overflow用户

发布于 2013-09-10 07:29:25

这个问题真的很老了,但在谷歌搜索中仍然会出现,所以我认为知道psycopg2.connection实例现在有一个closed attribute是有价值的,它在连接打开时为0,当连接关闭时大于0。下面的示例应该进行演示:

代码语言:javascript
复制
import psycopg2
import subprocess

connection = psycopg2.connect(
    dbname=database,
    user=username,
    password=password,
    host=host,
    port=port
)

print connection.closed # 0

# restart the db externally
subprocess.check_call("sudo /etc/init.d/postgresql restart", shell=True)

# this query will fail because the db is no longer connected
try:
    cur = connection.cursor()
    cur.execute('SELECT 1')
except psycopg2.OperationalError:
    pass

print connection.closed # 2
票数 68
EN

Stack Overflow用户

发布于 2013-11-20 16:39:33

connection.closed不反映服务器关闭/断开的连接。它仅表示客户端使用connection.close()关闭的连接

为了确保连接仍然有效,请读取属性connection.isolation_level。这将在连接中断的情况下引发一个带有pgcode == "57P01“的OperationalError。

这增加了往返到数据库的一些延迟,但应该比SELECT 1或类似的更好。

代码语言:javascript
复制
import psycopg2
dsn = "dbname=postgres"
conn = psycopg2.connect(dsn)

# ... some time elapses, e.g. connection within a connection pool

try:
    connection.isolation_level
except OperationalError as oe:
    conn = psycopg2.connect(dsn)

c = conn.cursor()
c.execute("SELECT 1")
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1281875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档