Завершение транзакции SELECT psycopg2 и postgres - PullRequest
1 голос
/ 20 июня 2019

Я выполняю несколько запросов SELECT в базе данных postgres, используя psycopg2, но получаю 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, чем этот.

...