我正在使用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
,但是使用起来似乎很奇怪,因为我没有更改表。
更新:当我在循环中显式打开和关闭连接时,未显示错误。但是,我认为有一个比这更好的方法来结束每个SELECT之后的事务。