Práce s velkými objekty (LOB)

Dotazování PostgreSQL databáze v Javě

Miller Trujillo

Staff Software Engineer

Velké objekty v databázích

  • BLOB: binární velký objekt (obrázky, videa, PDF)
  • CLOB: znakový velký objekt (dlouhý text, XML, JSON)

Reprezentace BLOB a CLOB

Dotazování PostgreSQL databáze v Javě

Proč BLOB a CLOB?

  • VARCHAR je vhodný pro malá data
  • BLOB a CLOB jsou určeny pro velmi rozsáhlý obsah
  • Podporují streamování: čtení a zápis po částech

Analogie – streamování filmu

Dotazování PostgreSQL databáze v Javě

Zápis BLOB v Javě

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 – přidává nové řádky do tabulky
  • setBinaryStream() – streamuje binární data do sloupce BLOB
Dotazování PostgreSQL databáze v Javě

Zápis CLOB v Javě

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() – streamuje textová data do sloupce CLOB

Dotazování PostgreSQL databáze v Javě

Čtení LOB v Javě

  • InputStream čte bajty; Reader čte znaky
  • BLOB: getBinaryStream() vrací InputStream
  • CLOB: getCharacterStream() vrací 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);
} } } }
Dotazování PostgreSQL databáze v Javě

Čtení CLOB pomocí Readeru

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: } } }
Dotazování PostgreSQL databáze v Javě

Doporučené postupy pro LOB

  • 📂 Preferujte ukládání odkazů (URL nebo cesty)
  • ⏩ Používejte streamovací API (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 Vyhněte se častým aktualizacím velmi velkých objektů

$$

$$

Reprezentace velkých objektů

Dotazování PostgreSQL databáze v Javě

Pojďme cvičit!

Dotazování PostgreSQL databáze v Javě

Preparing Video For Download...