Робота з великими об'єктами (LOB)

Запити до бази даних PostgreSQL у Java

Miller Trujillo

Staff Software Engineer

Великі об'єкти в базах даних

  • BLOB: Binary Large Object (зображення, відео, PDF)
  • CLOB: Character Large Object (довгий текст, 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); // Символи з 0 до 29
reader.read(cb); // Символи з 30 до 59: } } }
Запити до бази даних PostgreSQL у Java

Найкращі практики для LOB

  • 📂 Віддавайте перевагу збереженню посилань (URL або шляхів)
  • ⏩ Використовуйте потокові API (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Уникайте частих оновлень дуже великих об'єктів

$$

$$

Подання великих об'єктів

Запити до бази даних PostgreSQL у Java

Давайте потренуємось!

Запити до бази даних PostgreSQL у Java

Preparing Video For Download...