使用大對象 在 Postgres 里,大對象(也稱之為 液滴(blobs) )用于保存那些無法在通?!QL 表里面保存的數據.它們是通過表/索引對進行存儲的,然后用一個 OID 值從你自己的表里面引用. 關鍵:對于 Postgres,你必須在一個 SQL 事務里面訪問大對象。盡管我們總是這樣要求,但直到版本 6.5 我們才嚴格要求這樣做。你應該帶著一個輸入參數 false 使用 setAutoCommit() 方法打開一個事務: Connection mycon; ... mycon.setAutoCommit(false); ... now use Large Objects 現在,你有幾種使用大對象的方法.第一種是標準的 JDBC 方式,這個方式在這里有文檔.另一種,使用我們對該(JDBC)api?。ň幊探涌冢┑臄U展,也是一種用于 Java 的 libpq 大對象 API 的形式,提供了一種比標準方法更好的訪問大對象的訪問方法.在系統內部,該驅動使用這種擴展來提供大對象支持. 在JDBC里,標準的訪問大對象的方法是使用 ResultSet 里的 getBinaryStream() 方法,和PreparedStatement 里的 setBinaryStream() 方法.這些方法把大對象表示成 Java 的流(stream),允許你用 java.io 和其他的包來操縱這些對象.
例如,假設你有一個包含一幅圖象文件名的表,而且一個大對象包含這個圖象:
create table images (imgname name,imgoid oid); 要插入一幅圖象,你可以: File file = new File("myimage.gif"); FileInputStream fis = new FileInputStream(file); PreparedStatement ps = conn.prepareStatement("insert into images values (?,?)"); ps.setString(1,file.getName()); ps.setBinaryStream(2,fis,file.length()); ps.executeUpdate(); ps.close(); fis.close(); 現在,在這個例子里,setBinaryStream 從一個流里面把一定字節的數據轉換到大對象里,然后把(大對象的) OID 存儲到引用它的字段里. 檢索一幅圖象甚至更快(我在這里使用 PreparedStatement ,當然用 Statement 也是一樣的):
PreparedStatement ps = con.prepareStatement("select oid from images where name=?"); ps.setString(1,"myimage.gif"); ResultSet rs = ps.executeQuery(); if(rs!=null) { while(rs.next()) { InputStream is = rs.getBinaryInputStream(1); // use the stream in some way here is.close(); } rs.close(); } ps.close(); 這里你可以看到這里大對象是當做一個 InputStream?。ㄝ斎肓鳎z索的.你還會注意到我們在處理結果的下一行之前關閉了流.這是 JDBC 規范的一部分,該規范指出任何返回的 InputStream 在調用 ResultSet.next() 或 ResultSet.close() 后都要被關閉.