Trabajando con Objetos Grandes (LOBs)

Consultas a una base de datos PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

Objetos Grandes en Bases de Datos

  • BLOB: Objeto Binario Grande (imágenes, videos, PDFs)
  • CLOB: Objeto de Texto Grande (texto largo, XML, JSON)

Representación de BLOB y CLOB

Consultas a una base de datos PostgreSQL en Java

¿Por qué BLOBs y CLOBs?

  • VARCHAR funciona para datos pequeños
  • BLOB y CLOB están diseñados para contenido muy grande
  • Soportan streaming: leer y escribir en partes

Analogía - transmitiendo una película

Consultas a una base de datos PostgreSQL en Java

Escribiendo 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 - añade nuevas filas a una tabla
  • setBinaryStream() - transmite datos binarios a una columna BLOB
Consultas a una base de datos PostgreSQL en Java

Escribiendo 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() - transmite datos de texto a una columna CLOB

Consultas a una base de datos PostgreSQL en Java

Leyendo LOBs en Java

  • InputStream lee bytes; Reader lee caracteres
  • BLOB: getBinaryStream() devuelve un InputStream
  • CLOB: getCharacterStream() devuelve 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);
} } } }
Consultas a una base de datos PostgreSQL en Java

Leyendo CLOBs con 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: } } }
Consultas a una base de datos PostgreSQL en Java

Mejores Prácticas para LOBs

  • 📂 Prefiere almacenar referencias (como URLs o rutas)
  • ⏩ Usa APIs de streaming (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Evita actualizaciones frecuentes de objetos muy grandes

$$

$$

Representación de objetos grandes

Consultas a una base de datos PostgreSQL en Java

¡Vamos a practicar!

Consultas a una base de datos PostgreSQL en Java

Preparing Video For Download...