Làm việc với Large Objects (LOBs)

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Miller Trujillo

Staff Software Engineer

Large Objects trong cơ sở dữ liệu

  • BLOB: Binary Large Object (hình ảnh, video, PDF)
  • CLOB: Character Large Object (văn bản dài, XML, JSON)

Minh họa BLOB và CLOB

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Vì sao dùng BLOB và CLOB?

  • VARCHAR phù hợp cho dữ liệu nhỏ
  • BLOB và CLOB dành cho nội dung rất lớn
  • Hỗ trợ streaming: đọc/ghi theo từng khối

So sánh - phát trực tuyến một bộ phim

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ghi BLOB trong 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 - thêm hàng mới vào bảng
  • setBinaryStream() - stream dữ liệu nhị phân vào cột BLOB
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ghi CLOB trong 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() - stream dữ liệu văn bản vào cột CLOB

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Đọc LOB trong Java

  • InputStream đọc byte; Reader đọc ký tự
  • BLOB: getBinaryStream() trả về InputStream
  • CLOB: getCharacterStream() trả về 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);
} } } }
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Đọc CLOB bằng 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: } } }
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Thực hành tốt với LOB

  • 📂 Ưu tiên lưu tham chiếu (như URL hoặc đường dẫn)
  • ⏩ Dùng API streaming (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Tránh cập nhật thường xuyên các đối tượng rất lớn

$$

$$

Minh họa large objects

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Cùng luyện tập nào!

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Preparing Video For Download...