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.