ラージオブジェクト(LOB)の操作

Java で PostgreSQL データベースにクエリを実行する

Miller Trujillo

Staff Software Engineer

データベースのラージオブジェクト

  • BLOB:バイナリラージオブジェクト(画像、動画、PDFなど)
  • CLOB:文字ラージオブジェクト(長文テキスト、XML、JSONなど)

BLOBとCLOBの表現

Java で PostgreSQL データベースにクエリを実行する

BLOBとCLOBを使う理由

  • VARCHAR は小さなデータに適している
  • BLOBとCLOB は非常に大きなデータ向けに設計されている
  • ストリーミングをサポート:チャンク単位での読み書きが可能

動画ストリーミングのたとえ

Java で PostgreSQL データベースにクエリを実行する

JavaでのBLOB書き込み

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列にストリーミングする
Java で PostgreSQL データベースにクエリを実行する

JavaでのCLOB書き込み

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列にストリーミングする

Java で PostgreSQL データベースにクエリを実行する

JavaでのLOB読み取り

  • 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);
} } } }
Java で PostgreSQL データベースにクエリを実行する

ReaderによるCLOBの読み取り

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: } } }
Java で PostgreSQL データベースにクエリを実行する

LOBのベストプラクティス

  • 📂 参照(URLやパスなど)の保存を優先する
  • ⏩ ストリーミングAPIを使用する(setBinaryStream()、getBinaryStream()、setCharacterStream())
  • 🚫 非常に大きなオブジェクトの頻繁な更新は避ける

$$

$$

ラージオブジェクトの表現

Java で PostgreSQL データベースにクエリを実行する

練習しましょう!

Java で PostgreSQL データベースにクエリを実行する

Preparing Video For Download...