2011-01-10 72 views
11

我用Hibernate 3.2和PostgreSQL 8.4開始了一個應用程序。我有一些byte[]字段被映射爲@Basic(= PG bytea)和映射爲@Lob(= PG大對象)的其他字段。爲什麼不一致?因爲我是一個Hibernate noob。PostgreSQL:BYTEA vs OID +大對象?

現在,這些字段最大爲4 Kb(但平均值爲2-3 kb)。 PostgreSQL文檔提到,當字段很大時,LO是好的,但我沒有看到「大」意味着什麼。

我已經使用Hibernate 3.6升級到PostgreSQL 9.0,並且我堅持要將註釋更改爲@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")。這個bug帶來了一個潛在的兼容性問題,並且我最終發現大型對象與一個普通的字段相比是一個很難處理的問題。

所以我想把它全部改爲bytea。但我擔心bytea字段是以十六進制編碼的,所以在編碼和解碼時會有一些開銷,這會損害性能。

是否有良好的基準關於這兩方面的表現? 有人做了開關,看到了一個區別?

回答

5

基本上有些情況下每個都有意義。 bytea更簡單並且通常是首選。客戶端庫給你解碼,所以這不是一個問題。

但是,LOB具有一些簡潔的特性,例如能夠在它們中尋找並將LOB視爲字節流而不是字節數組。

「大」意味着「足夠大你不想一次發送給客戶端。」從技術上講,bytea被限制爲1GB壓縮,並且一個lob限制爲2GB壓縮,但是無論如何你真的首先達到了其他限制。如果足夠大,您不希望它直接在結果集中,而且也不想將它一次全部發送到客戶端,請使用LOB。

4

但我很擔心,BYTEA領域 十六進制編碼

BYTEA輸入可以是十六進制或逃避格式,這是你的選擇。存儲將是相同的。從版本9.0開始,輸出默認值爲十六進制,但可以通過編輯參數bytea_output來更改此設置。

我還沒有看到任何基準。

+0

此外它不是以十六進制存儲的,我認爲libpq(甚至可能是協議)有一個二進制傳輸接口。 – 2013-11-16 04:09:40

1

我沒有比較大的對象和bytea方便,但請注意,切換到9.0的十六進制輸出格式也是因爲它比以前的自定義編碼更快。就二進制數據的文本編碼而言,你可能不會比目前的速度快得多。

如果對您來說不夠好,您可以考慮在PostgreSQL客戶端和服務器之間使用二進制協議。然後你基本上從磁盤上獲得東西,就像大型對象一樣。我不知道PostgreSQL JDBC是否支持這個功能,但是快速搜索建議不支持。