Werken met Large Objects (LOBs)

Query's uitvoeren op een PostgreSQL-database in Java

Miller Trujillo

Staff Software Engineer

Large Objects in Databases

  • BLOB: Binaire Large Object (afbeeldingen, video's, PDF's)
  • CLOB: Karakter Large Object (lange tekst, XML, JSON)

Representatie van BLOB en CLOB

Query's uitvoeren op een PostgreSQL-database in Java

Waarom BLOBs en CLOBs?

  • VARCHAR is voor kleine data
  • BLOB en CLOB zijn voor zeer grote inhoud
  • Ondersteunt streaming: lees en schrijf in delen

Analogie - een film streamen

Query's uitvoeren op een PostgreSQL-database in Java

Een BLOB schrijven in 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 - voegt nieuwe rijen toe aan een tabel
  • setBinaryStream() - streamt binaire data naar een BLOB-kolom
Query's uitvoeren op een PostgreSQL-database in Java

Een CLOB schrijven in 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() - streamt tekstdata naar een CLOB-kolom

Query's uitvoeren op een PostgreSQL-database in Java

LOBs lezen in Java

  • InputStream leest bytes; Reader leest karakters
  • BLOB: getBinaryStream() geeft een InputStream
  • CLOB: getCharacterStream() geeft een 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);
} } } }
Query's uitvoeren op een PostgreSQL-database in Java

CLOBs lezen met Readers

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: } } }
Query's uitvoeren op een PostgreSQL-database in Java

Best Practices voor LOBs

  • 📂 Bewaar referenties (zoals URLs of paden)
  • ⏩ Gebruik streaming-API's (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Vermijd frequente updates van zeer grote objecten

$$

$$

Representatie van grote objecten

Query's uitvoeren op een PostgreSQL-database in Java

Laten we oefenen!

Query's uitvoeren op een PostgreSQL-database in Java

Preparing Video For Download...