Travailler avec les objets volumineux (LOBs)

Interroger une base de données PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

Objets volumineux dans les bases de données

  • BLOB : Objet Binaire Volumineux (images, vidéos, PDFs)
  • CLOB : Objet Caractère Volumineux (texte long, XML, JSON)

Représentation des BLOB et CLOB

Interroger une base de données PostgreSQL en Java

Pourquoi les BLOBs et CLOBs ?

  • VARCHAR convient aux petites données
  • BLOB et CLOB sont conçus pour les contenus très volumineux
  • Supporte le streaming : lire et écrire par morceaux

Analogie - streaming 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 à une table
  • setBinaryStream() - envoie des données binaires à 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() - envoie des données textuelles à une colonne CLOB

Interroger une base de données PostgreSQL en Java

Lire les LOBs 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 les CLOBs 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

Bonnes pratiques pour les LOBs

  • 📂 Préférez stocker des références (comme des URLs ou chemins)
  • ⏩ Utilisez les API de streaming (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Évitez les mises à jour fréquentes des 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...