我正在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
答案 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。