Arbeta med stora objekt (LOBs)

Fråga en PostgreSQL-databas i Java

Miller Trujillo

Staff Software Engineer

Stora objekt i databaser

  • BLOB: Binary Large Object (bilder, videor, PDF-filer)
  • CLOB: Character Large Object (lång text, XML, JSON)

BLOB och CLOB-representation

Fråga en PostgreSQL-databas i Java

Varför BLOB och CLOB?

  • VARCHAR fungerar för liten data
  • BLOB och CLOB är utformade för mycket stort innehåll
  • Stöder strömning: läs och skriv i delar

Analogi – strömma en film

Fråga en PostgreSQL-databas i Java

Skriva en BLOB i 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 – lägger till nya rader i en tabell
  • setBinaryStream() – strömmar binärdata till en BLOB-kolumn
Fråga en PostgreSQL-databas i Java

Skriva en CLOB i 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() – strömmar textdata till en CLOB-kolumn

Fråga en PostgreSQL-databas i Java

Läsa LOBs i Java

  • InputStream läser bytes; Reader läser tecken
  • BLOB: getBinaryStream() returnerar en InputStream
  • CLOB: getCharacterStream() returnerar en 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);
} } } }
Fråga en PostgreSQL-databas i Java

Läsa CLOBs med 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: } } }
Fråga en PostgreSQL-databas i Java

Bästa praxis för LOBs

  • 📂 Föredra att lagra referenser (t.ex. URL:er eller sökvägar)
  • ⏩ Använd ström-API:er (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Undvik frekventa uppdateringar av mycket stora objekt

$$

$$

Representation av stora objekt

Fråga en PostgreSQL-databas i Java

Nu kör vi en övning!

Fråga en PostgreSQL-databas i Java

Preparing Video For Download...