PostgreSQL - как выполнить ВАКУУМ из кода вне блока транзакции?

Пожалуйста, попробуйте это.

PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pInfo.versionName;
33
задан Wayne Koorts 19 June 2009 в 11:26
поделиться

3 ответа

После дополнительных поисков я обнаружил свойство isolated_level объекта подключения psycopg2. Оказывается, изменение этого параметра на 0 выведет вас из блока транзакции. Ее решает изменение вакуумного метода вышеуказанного класса на следующий. Обратите внимание, что я также установил уровень изоляции обратно на тот, который был ранее на всякий случай (кажется, 1 по умолчанию).

def vacuum(self):
    old_isolation_level = self.conn.isolation_level
    self.conn.set_isolation_level(0)
    query = "VACUUM FULL"
    self._doQuery(query)
    self.conn.set_isolation_level(old_isolation_level)

Эта статья (в конце на этой странице) предоставляет краткое объяснение уровней изоляции в этом контексте.

55
ответ дан 27 November 2019 в 18:10
поделиться

Не делайте этого - вам не нужен ПОЛНЫЙ ВАКУУМ. На самом деле, если вы используете несколько свежую версию Postgres (скажем,> 8.1), вам даже не нужно запускать простой VACUUM вручную.

-3
ответ дан 27 November 2019 в 18:10
поделиться

Я не знаю psycopg2 и PostgreSQL, но знаю только apsw и SQLite, поэтому думаю, что не могу помочь с "psycopg2".

Но мне кажется, что PostgreSQL может работает аналогично SQLite, он имеет два режима работы:

  • Вне блока транзакции: семантически эквивалентен блоку транзакции вокруг каждой отдельной операции SQL.
  • Внутри блока транзакции, помеченного как «НАЧАТЬ ТРАНЗАКЦИЮ» "и заканчивается" КОНЕЦ ТРАНЗАКЦИИ "

В этом случае проблема может быть внутри уровня доступа psycopg2. Когда он обычно работает таким образом, что транзакции неявно вставляются до тех пор, пока не будет сделана фиксация, не может быть «стандартного способа» создания вакуума.

Конечно, возможно, что у «psycopg2» есть свой особый ». вакуум » метод или специальный режим работы, в котором не запускаются неявные транзакции.

Когда таких возможностей нет, остается один единственный вариант (без изменения уровня доступа ;-)):

Большинство баз данных имеют программу оболочки для получить доступ к базе данных. Программа могла запускать эту программу оболочки с конвейером (вводя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум - это медленная операция как таковая, запуском внешней программы можно пренебречь. Конечно, реальная программа должна зафиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен дождаться окончания вашей последней транзакции.

остается один единственный вариант (без изменения уровня доступа ;-)):

В большинстве баз данных есть программа оболочки для доступа к базе данных. Программа могла запускать эту программу оболочки с конвейером (вводя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум - это медленная операция как таковая, запуском внешней программы можно пренебречь. Конечно, реальная программа должна зафиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен дождаться окончания вашей последней транзакции.

остается один единственный вариант (без изменения уровня доступа ;-)):

В большинстве баз данных есть программа оболочки для доступа к базе данных. Программа могла запускать эту программу оболочки с конвейером (вводя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум - это медленная операция как таковая, запуском внешней программы можно пренебречь. Конечно, реальная программа должна зафиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен дождаться окончания вашей последней транзакции.

запуском внешней программы можно пренебречь. Конечно, реальная программа должна зафиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен дождаться окончания вашей последней транзакции.

запуском внешней программы можно пренебречь. Конечно, реальная программа должна зафиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен дождаться окончания вашей последней транзакции.

1
ответ дан 27 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: