2011-08-08 54 views
3

我在Oracle數據庫(10g及更高版本的11g)上的Weblogic App-Server(10.3.3)上運行應用程序,看起來應用程序的內存管理不正確,因爲它運行後而它開始反覆拋出「超出gc開銷限制」的例外。如何在Oracle Weblogic應用程序服務器中懶獲取LOB?

我使用jvisualvm對我的服務器進行了剖析,看起來大部分堆由字節數組組成,而且這些字節數組與我的一個主要實體相關聯,作爲其'數據'成員(DB中的BLOB)。

我試圖改變這種實體是這樣的:

@Basic(fetch=LAZY) 
@LOB 
public byte[] getData() { return this.data; } 

但後來我總是空。

無論如何懶得取我的LOB?

更新

我使用它自帶的Weblogic應用服務器的默認提供。我沒有碰到服務器上的任何JPA配置。我現在的代碼很簡單(只是一個沙箱),它只是發現我的實體使用em.find()(根據行ID),然後我只是打電話myEntity.getData(),它返回null。

+0

您無法發表評論,因爲您使用的帳號與您用於發佈此問題的帳號不同。我已通知國防部。 – dandan78

+0

您使用的是JPA提供程序?當你訪問它時,fetch = LAZY應該會引起一個查詢。在訪問對象之前是否分離/序列化對象? – James

+0

@James:出於某種原因,我無法爲您的答案添加評論,所以我會在這裏回答:我正在使用Weblogic應用程序服務器附帶的默認提供程序。我沒有觸及服務器上的任何JPA配置。我的代碼目前很簡單(有點像沙箱),它只是找到我的實體使用em.find(根據行ID),然後我只是調用myEntity.getData(),它返回null。 – 2011-08-09 15:31:22

回答

1

這是我再次,有問題登錄到同一個用戶。 無論如何,找到了一個解決方案:

我將我的服務器的JPA提供程序切換到TopLink,但最好我可以得到的是一個非延遲獲取(但至少沒有空或異常)。

然後我嘗試了一個不同的方法。我爲保存我的lob字段的同一個表創建了一個新的實體,而我的前一個實體沒有保存lob字段,而是新的實體。我用兩個一對一的關係把它們連接起來,然後懶惰地抓取它,它就起作用了!

我花了一些時間,因爲只有特定的映射工作,因爲你可以在這裏看到:

@Entity 
@Table(name="MY_TABLE") 
public class A implements Serializable { 

    private Long id; 
    private ALob lob; 

    @Id 
    public Long getId() {return id;} 
    public void setId(Long id) {this.id = id;} 

    @OneToOne(fetch=LAZY) 
    @JoinColumn(name="ID", insertable=false, updatable=false) 
    public ALob getLob() {return lob;} 
    public void setLob(ALob lob) {this.lob = lob;} 
} 

@Entity 
@Table(name="MY_TABLE") 
public class ALob implements Serializable { 

    private Long id; 
    private byte[] data; 

    @Id 
    public Long getId() {return id;} 
    public void setId(Long id) {this.id = id;} 

    public byte[] getData() {return data;} 
    public void setData(byte[] data) {this.data = data;} 

} 

哦,順便說一句,它不會與科多獸,只有TopLink的工作。

相關問題