การทำงานกับ Large Objects (LOBs)

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

Miller Trujillo

Staff Software Engineer

Large Objects ในฐานข้อมูล

  • BLOB: Binary Large Object (รูปภาพ, วิดีโอ, PDF)
  • CLOB: Character Large Object (ข้อความยาว, XML, JSON)

การแสดง BLOB และ CLOB

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

ทำไมต้องใช้ BLOB และ CLOB?

  • VARCHAR เหมาะสำหรับข้อมูลขนาดเล็ก
  • BLOB และ CLOB ออกแบบมาสำหรับเนื้อหาขนาดใหญ่มาก
  • รองรับการสตรีม: อ่านและเขียนเป็นก้อนข้อมูล

การเปรียบเทียบ - การสตรีมภาพยนตร์

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

การเขียน BLOB ใน 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 - เพิ่มแถวใหม่ลงในตาราง
  • setBinaryStream() - สตรีมข้อมูลไบนารีไปยังคอลัมน์ BLOB
การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

การเขียน CLOB ใน 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() - สตรีมข้อมูลข้อความไปยังคอลัมน์ CLOB

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

การอ่าน LOBs ใน Java

  • InputStream อ่านไบต์; Reader อ่านอักขระ
  • BLOB: getBinaryStream() คืนค่าเป็น InputStream
  • CLOB: getCharacterStream() คืนค่าเป็น 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);
} } } }
การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

การอ่าน CLOB ด้วย 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: } } }
การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

แนวปฏิบัติที่ดีสำหรับ LOBs

  • 📂 ควรเก็บการอ้างอิง (เช่น URL หรือพาธ) แทนข้อมูลจริง
  • ⏩ ใช้ streaming API (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 หลีกเลี่ยงการอัปเดต large objects บ่อยครั้ง

$$

$$

การแสดง large objects

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

มาฝึกกันเถอะ!

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

Preparing Video For Download...