如何在Oracle Weblogic应用服务器中延迟获取LOB?

时间:2011-08-08 13:20:59

标签: oracle jpa memory-leaks weblogic

我正在Oracle数据库(10g及更高版本11g)上的Weblogic App-Server(10.3.3)上运行应用程序,看起来我的应用程序内存管理不正确,因为运行它之后一段时间它开始反复抛出“超出gc开销限制”的异常。

我使用jvisualvm描述了我的服务器,看起来大部分堆由字节数组组成,并且这些字节数组与我的一个主要实体相关联,作为其“数据”成员(数据库中的BLOB)。

我试图用这样的东西改变那个实体:

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

然后我总是得到null。

是否有懒人取我的LOB?

更新

我正在使用Weblogic应用服务器附带的默认提供程序。我没有触及服务器上的任何JPA配置。

我的代码目前非常简单(类似于沙箱),它只是使用em.find()找到我的实体(根据行ID)然后我只调用myEntity.getData()返回null

1 个答案:

答案 0 :(得分:1)

这是我的问题,登录同一个用户时出现问题。 无论如何,找到了解决方案:

我将服务器的JPA Provider切换到TopLink,但是我能得到的最好的是非延迟抓取(但至少没有null或异常)。

然后我尝试了另一种方法。我为同一个表创建了一个新实体,它保存了我的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;}

}

哦,顺便说一句,它不适用于kodo,只适用于TopLink。