2011-11-02 55 views
1

我有一個應用程序必須處理包含序列化圖像的對象列表(從數據庫中檢索使用JPA)。提高Jpa映像加載時間的性能

問題是,當我在數據庫中存儲50個此對象的實例時,從數據庫加載50張圖片(〜5秒)變得非常慢,這對用戶來說變得煩人。

有沒有辦法將此列從數據庫設置爲惰性初始化?或者我應該創建一個單獨的對象來攜帶圖像,並使用ID引用它?

感謝您的幫助。

回答

0

是的,有一個layz加載attriubte的屬性。

@Basic(fetch = FetchType.LAZY) 
private String myBigString; 

從JPA 2.0規範

11.1.6基本註釋基本註釋是映射到數據庫列的最簡單的類型。基本註釋可應用於 持久屬性或以下任何一種 類型的實例變量:Java基本類型,基本類型的包裝, java.lang.String,java.math.BigInteger,java.math.BigDecimal , java.util.Date,java.util.Calendar,java.sql.Date,java.sql.Time, java.sql.Timestamp,byte [],Byte [],char [],Character [],枚舉,以及任何其他實現Serializable的類型。

...

的FetchType枚舉定義策略,從 數據庫中獲取的數據:公共枚舉FetchType {LAZY,EAGER};

...

懶惰的策略是一個暗示,持久性提供運行時 數據應該被延遲加載當第一次訪問它。允許 實現熱切地獲取LAZY 策略提示已被指定的數據。特別是,懶惰提取可能只適用於使用基於屬性的訪問 的基本映射。其他


一種技術能夠具有相同的表的第二映射,但只有你所需要的屬性。

+0

感謝您的解釋,但我已經測試了@Basic註釋沒有成功。此外,使用存儲圖像id對並引用該ID的表的選項是不可行的,因爲我們已經在生產中設置了此應用程序,並且我們需要修改現在不打算使用的sql數據庫。可能在將來這將不得不完成。 –

+1

@JosepRodríguezLópez:第二種方式並不意味着改變表結構,我簡單的建議讓第二個java實體映射到同一個表。所以你有兩個,一個是Image列,另一個沒有。 – Ralph

1

Hibernate至少允許使用懶惰列(使用@Basic批註的fetch屬性),但我認爲它不被所有JPA供應商支持。

真的有必要將圖像存儲在數據庫中嗎?將它們存儲在文件系統中並將路徑存儲在數據庫中往往更高效。

+0

這是必要的。我已經測試了JPA @basic註解,但似乎與我的供應商(eclipselink)無法正常工作,所以我猜測它並未被此實現覆蓋。 –