Travailler avec les objets volumineux (LOB)

Interroger une base de données PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

Objets volumineux dans les bases de données

  • BLOB : Binary Large Object (images, vidéos, PDF)
  • CLOB : Character Large Object (longs textes, XML, JSON)

Représentation des BLOB et CLOB

Interroger une base de données PostgreSQL en Java

Pourquoi des BLOB et des CLOB ?

  • VARCHAR convient aux petites données
  • BLOB et CLOB pour du contenu très volumineux
  • Prise en charge du flux : lecture/écriture par blocs

Analogie - diffusion d'un film

Interroger une base de données PostgreSQL en Java

Écrire un BLOB en 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 : ajoute de nouvelles lignes dans une table
  • setBinaryStream() : diffuse des données binaires vers une colonne BLOB
Interroger une base de données PostgreSQL en Java

Écrire un CLOB en 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() : diffuse des données textuelles vers une colonne CLOB

Interroger une base de données PostgreSQL en Java

Lire des LOB en Java

  • InputStream lit des octets ; Reader lit des caractères
  • BLOB : getBinaryStream() retourne un InputStream
  • CLOB : getCharacterStream() retourne 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);
} } } }
Interroger une base de données PostgreSQL en Java

Lire des CLOB avec des 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: } } }
Interroger une base de données PostgreSQL en Java

Pratiques exemplaires pour les LOB

  • 📂 Privilégier l'entreposage de références (URL ou chemins)
  • ⏩ Utiliser les API de flux (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Éviter les mises à jour fréquentes d'objets très volumineux

$$

$$

Représentation des objets volumineux

Interroger une base de données PostgreSQL en Java

Passons à la pratique !

Interroger une base de données PostgreSQL en Java

Preparing Video For Download...