Praca z dużymi obiektami (LOB)

Zapytania do bazy danych PostgreSQL w Javie

Miller Trujillo

Staff Software Engineer

Duże obiekty w bazach danych

  • BLOB: binarny duży obiekt (obrazy, wideo, PDF)
  • CLOB: znakowy duży obiekt (długi tekst, XML, JSON)

Reprezentacja BLOB i CLOB

Zapytania do bazy danych PostgreSQL w Javie

Dlaczego BLOB i CLOB?

  • VARCHAR sprawdza się przy małych danych
  • BLOB i CLOB są przeznaczone do bardzo dużych treści
  • Obsługują strumieniowanie: odczyt i zapis we fragmentach

Analogia – strumieniowanie filmu

Zapytania do bazy danych PostgreSQL w Javie

Zapis BLOB w Javie

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 - dodaje nowe wiersze do tabeli
  • setBinaryStream() - przesyła strumieniowo dane binarne do kolumny BLOB
Zapytania do bazy danych PostgreSQL w Javie

Zapis CLOB w Javie

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() - przesyła strumieniowo dane tekstowe do kolumny CLOB

Zapytania do bazy danych PostgreSQL w Javie

Odczyt LOB w Javie

  • InputStream odczytuje bajty; Reader odczytuje znaki
  • BLOB: getBinaryStream() zwraca InputStream
  • CLOB: getCharacterStream() zwraca 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);
} } } }
Zapytania do bazy danych PostgreSQL w Javie

Odczyt CLOB za pomocą 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: } } }
Zapytania do bazy danych PostgreSQL w Javie

Najlepsze praktyki dla LOB

  • 📂 Preferuj przechowywanie referencji (np. URL lub ścieżek)
  • ⏩ Używaj strumieniowych API (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Unikaj częstych aktualizacji bardzo dużych obiektów

$$

$$

Reprezentacja dużych obiektów

Zapytania do bazy danych PostgreSQL w Javie

Ćwiczmy!

Zapytania do bazy danych PostgreSQL w Javie

Preparing Video For Download...