Arbeiten mit großen Objekten (LOBs)

Abfragen einer PostgreSQL-Datenbank in Java

Miller Trujillo

Staff Software Engineer

Große Objekte in Datenbanken

  • BLOB: Binäres Großobjekt (Bilder, Videos, PDFs)
  • CLOB: Zeichen-Großobjekt (langer Text, XML, JSON)

Darstellung von BLOB und CLOB

Abfragen einer PostgreSQL-Datenbank in Java

Warum BLOBs und CLOBs?

  • VARCHAR für kleine Daten
  • BLOB und CLOB für sehr große Inhalte
  • Unterstützt Streaming: in Teilen lesen und schreiben

Analogie - einen Film streamen

Abfragen einer PostgreSQL-Datenbank in Java

Einen BLOB in Java schreiben

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 - fügt neue Zeilen in eine Tabelle ein
  • setBinaryStream() - streamt Binärdaten in eine BLOB-Spalte
Abfragen einer PostgreSQL-Datenbank in Java

Einen CLOB in Java schreiben

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 Textdaten in eine CLOB-Spalte

Abfragen einer PostgreSQL-Datenbank in Java

LOBs in Java lesen

  • InputStream liest Bytes; Reader liest Zeichen
  • BLOB: getBinaryStream() gibt einen InputStream zurück
  • CLOB: getCharacterStream() gibt einen Reader zurück
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);
} } } }
Abfragen einer PostgreSQL-Datenbank in Java

CLOBs mit Readern lesen

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: } } }
Abfragen einer PostgreSQL-Datenbank in Java

Best Practices für LOBs

  • 📂 Bevorzuge das Speichern von Referenzen (wie URLs oder Pfade)
  • ⏩ Verwende Streaming-APIs (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Vermeide häufige Updates sehr großer Objekte

$$

$$

Darstellung großer Objekte

Abfragen einer PostgreSQL-Datenbank in Java

Lass uns üben!

Abfragen einer PostgreSQL-Datenbank in Java

Preparing Video For Download...