Bekerja dengan Objek Besar (LOB)

Melakukan Query ke Basis Data PostgreSQL di Java

Miller Trujillo

Staff Software Engineer

Objek Besar dalam Basis Data

  • BLOB: Objek Biner Besar (gambar, video, PDF)
  • CLOB: Objek Karakter Besar (teks panjang, XML, JSON)

Representasi BLOB dan CLOB

Melakukan Query ke Basis Data PostgreSQL di Java

Mengapa BLOB dan CLOB?

  • VARCHAR cocok untuk data kecil
  • BLOB dan CLOB dirancang untuk konten sangat besar
  • Mendukung streaming: baca dan tulis dalam bagian

Analogi - streaming film

Melakukan Query ke Basis Data PostgreSQL di Java

Menulis BLOB dalam 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 - menambah baris baru ke tabel
  • setBinaryStream() - mengalirkan data biner ke kolom BLOB
Melakukan Query ke Basis Data PostgreSQL di Java

Menulis CLOB dalam 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() - mengalirkan data teks ke kolom CLOB

Melakukan Query ke Basis Data PostgreSQL di Java

Membaca LOB dalam Java

  • InputStream membaca byte; Reader membaca karakter
  • BLOB: getBinaryStream() mengembalikan InputStream
  • CLOB: getCharacterStream() mengembalikan 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);
} } } }
Melakukan Query ke Basis Data PostgreSQL di Java

Membaca CLOB dengan 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: } } }
Melakukan Query ke Basis Data PostgreSQL di Java

Praktik Terbaik untuk LOB

  • 📂 Lebih baik simpan referensi (seperti URL atau path)
  • ⏩ Gunakan API streaming (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Hindari pembaruan sering pada objek sangat besar

$$

$$

Representasi objek besar

Melakukan Query ke Basis Data PostgreSQL di Java

Ayo berlatih!

Melakukan Query ke Basis Data PostgreSQL di Java

Preparing Video For Download...