lo
Управление большими объектами (LO, Large Objects).
Схема размещения:
ext.Модуль
lo поддерживает управление большими объектами (Large Objects, Binary Large OBjects) и реализует тип данных lo и триггер lo_manage.Большие объекты (LO, Large Objects или BLOB, Binary Large Objects) предназначены для хранения большого объема данных.
В PostgreSQL имеется механизм для работы с большими объектами, который предоставляет доступ к пользовательским данным в потоковом режиме. Потоковый доступ удобен для обработки данных большого объема, когда невозможно оперировать ими как единым целым.
Особенностью драйвера
JDBC (как и ODBC) является то, что спецификация типа предполагает хранение в таблице ссылок на BLOB. Если запись меняется, связанный BLOB удаляется из базы.В PostgreSQL большие объекты обрабатываются как самостоятельные. Запись в таблице может ссылаться на большой объект по OID, при этом на него могут ссылаться несколько записей таблицы. Если меняется или удаляется такая запись, система не удаляет связанный с ней большой объект.
Вследствие работы стандартного кода, использующего
JDBC или ODBC, большой объект не будет удален и может оказаться потерянным, то есть никак не задействованным. Он будет просто занимать место на диске.Ориентированные на PostgreSQL приложения учитывают особенность логики СУБД и потеря большого объекта не предполагается.
Модуль
lo добавляет триггер lo_manage к таблицам, которые содержат ссылки на большие объекты. Этот триггер вызывает функцию lo_unlink, когда вы удаляете или изменяете значение, ссылающееся на большой объект.Описание функции
lo_unlink:-
вызов:
lo_unlink(PGconn *conn, Oid lobjId); -
аргументы:
PGconn– объект-соединение от библиотекиlibpq(функции управления подключением к базе данных);lobjId–OIDудаляемого большого объекта.
-
возвращаемое значение:
1: успешно;-1: неуспешно.
-
пример вызова:
SELECT lo_unlink ('5034');
Для очистки базы данных от потерянных больших объектов можно использовать функциональность приложения vacuumlo.
- Создать таблицу; столбец
bigoимеет тип данныхlo:
CREATE TABLE t_lo (name text, bigo lo);
-
Создать триггер
lo_manage. В качестве аргумента триггеру передать имя столбца, содержащего уникальные ссылки на большие объекты; триггер будет вызывать функцию удаления большого объекта при изменении или удалении строки:CREATE TRIGGER t_bigo BEFORE UPDATE OR DELETE ON t_lo FOR EACH ROW EXECUTE FUNCTION lo_manage(bigo);
Дополнительную информацию по поставляемому модулю lo можно получить по ссылке.
Документация по работе с большими объектами: https://www.postgresql.org/docs/current/largeobjects.html.
Функции управления подключением к базе данных: https://www.postgresql.org/docs/13/libpq-connect.html.