Lucrul cu obiecte mari (LOB)

Interogarea unei baze de date PostgreSQL în Java

Miller Trujillo

Staff Software Engineer

Obiecte mari în baze de date

  • BLOB: obiect binar mare (imagini, videoclipuri, PDF-uri)
  • CLOB: obiect de tip caracter mare (text lung, XML, JSON)

Reprezentarea BLOB și CLOB

Interogarea unei baze de date PostgreSQL în Java

De ce BLOB și CLOB?

  • VARCHAR este potrivit pentru date mici
  • BLOB și CLOB sunt concepute pentru conținut foarte mare
  • Suportă streaming: citire și scriere în fragmente

Analogie - redarea în flux a unui film

Interogarea unei baze de date PostgreSQL în Java

Scrierea unui BLOB în 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 - adaugă rânduri noi într-un tabel
  • setBinaryStream() - transmite date binare într-o coloană BLOB
Interogarea unei baze de date PostgreSQL în Java

Scrierea unui CLOB în 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() - transmite date text într-o coloană CLOB

Interogarea unei baze de date PostgreSQL în Java

Citirea LOB-urilor în Java

  • InputStream citește octeți; Reader citește caractere
  • BLOB: getBinaryStream() returnează un InputStream
  • CLOB: getCharacterStream() returnează un 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);
} } } }
Interogarea unei baze de date PostgreSQL în Java

Citirea CLOB-urilor cu 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: } } }
Interogarea unei baze de date PostgreSQL în Java

Bune practici pentru LOB-uri

  • 📂 Preferați stocarea referințelor (URL-uri sau căi)
  • ⏩ Utilizați API-uri de streaming (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Evitați actualizările frecvente ale obiectelor foarte mari

$$

$$

Reprezentarea obiectelor mari

Interogarea unei baze de date PostgreSQL în Java

Să exersăm!

Interogarea unei baze de date PostgreSQL în Java

Preparing Video For Download...