我正在使用psycopg2对postgres数据库执行许多SELECT查询,但是我得到了ERROR: Out of shared memory
。它建议我应该增加max_locks_per_transaction.
,但这让我很困惑,因为每个SELECT查询只在一个表上操作,而且max_locks_per_transaction
已经设置为512,是默认值的8倍。你知道吗
我使用的是TimescaleDB,这可能是由于锁的数量超过了正常数量(可能是每个块对应一个锁,而不是每个表对应一个锁),但这仍然不能解释在允许这么多锁的情况下会出现的问题。我假设这里发生的是所有查询都作为一个事务的一部分运行。你知道吗
我使用的代码如下所示。你知道吗
db = DatabaseConnector(**connection_params)
tables = db.get_table_list()
for table in tables:
result = db.query(f"""SELECT a, b, COUNT(c) FROM {table} GROUP BY a, b""")
print(result)
其中db.query
定义为:
def query(self, sql):
with self._connection.cursor() as cur:
cur.execute(sql)
return_value = cur.fetchall()
return return_value
而self._connection
是:
self._connection = psycopg2.connect(**connection_params)
我是否需要以某种方式显式结束事务以释放锁?我怎样才能在psycopg2
中这样做呢?我假设当光标在__exit__
上关闭时,事务会隐式结束。我知道如果我插入或删除行,我会在末尾使用COMMIT
,但是使用它似乎很奇怪,因为我没有更改表。你知道吗
更新:当我显式地打开和关闭循环中的连接时,不会显示错误。但是,我假设在每次选择之后有一种更好的方法来结束事务。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐