Работа с большими объектами (LOB)

Работа с базой данных PostgreSQL на Java

Miller Trujillo

Staff Software Engineer

Большие объекты в базах данных

  • BLOB: двоичный большой объект (изображения, видео, PDF)
  • CLOB: символьный большой объект (длинный текст, XML, JSON)

Представление BLOB и CLOB

Работа с базой данных PostgreSQL на Java

Зачем нужны BLOB и CLOB?

  • VARCHAR подходит для небольших данных
  • BLOB и CLOB предназначены для очень больших объёмов
  • Поддерживают потоковую передачу: чтение и запись по частям

Аналогия — потоковое воспроизведение фильма

Работа с базой данных PostgreSQL на Java

Запись BLOB в Java

String sql = "INSERT INTO covers (book_id, image) VALUES (?, ?)";


try (PreparedStatement pstmt = conn.prepareStatement(sql); FileInputStream fis = new FileInputStream("cover.png")) {
pstmt.setInt(1, 101);
pstmt.setBinaryStream(2, fis);
pstmt.executeUpdate();
}
  • INSERT — добавляет новые строки в таблицу
  • setBinaryStream() — передаёт двоичные данные в столбец BLOB
Работа с базой данных PostgreSQL на Java

Запись CLOB в Java

String sql = "INSERT INTO manuscripts (book_id, content) VALUES (?, ?)";

try (PreparedStatement pstmt = conn.prepareStatement(sql);

FileReader reader = new FileReader("manuscript.txt")) {
pstmt.setInt(1, 101);
pstmt.setCharacterStream(2, reader);
pstmt.executeUpdate();
}

setCharacterStream() — передаёт текстовые данные в столбец CLOB

Работа с базой данных PostgreSQL на Java

Чтение LOB в Java

  • InputStream читает байты; Reader читает символы
  • BLOB: getBinaryStream() возвращает InputStream
  • CLOB: getCharacterStream() возвращает Reader
String sql = "SELECT image FROM covers WHERE book_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 101);
    try (ResultSet rs = pstmt.executeQuery()) {

if (rs.next()) {
try (InputStream is = rs.getBinaryStream("image");
FileOutputStream fos = new FileOutputStream("out.png")){
is.transferTo(fos);
} } } }
Работа с базой данных PostgreSQL на Java

Чтение CLOB с помощью Reader

String sql = "SELECT content FROM manuscripts";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
     ResultSet rs = pstmt.executeQuery()) {

while (rs.next()) {
try (Reader reader = rs.getCharacterStream("content")) {
char[] cb = new char[30];
reader.read(cb); // Chars from 0 to 29
reader.read(cb); // Chars from 30 to 59: } } }
Работа с базой данных PostgreSQL на Java

Рекомендации по работе с LOB

  • 📂 Предпочтительно хранить ссылки (URL или пути к файлам)
  • ⏩ Используйте потоковые API (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Избегайте частых изменений очень больших объектов

$$

$$

Представление больших объектов

Работа с базой данных PostgreSQL на Java

Давайте потренируемся!

Работа с базой данных PostgreSQL на Java

Preparing Video For Download...