2011-08-08 8 views
3

Oracleデータベース(10g以降、11g)のWeblogic App-Server(10.3.3)でアプリケーションを実行しています。アプリケーションのメモリが正しく管理されていないようです。それは "gcオーバーヘッド限界超過"例外を繰り返しスローし始めます。Oracle Weblogicアプリケーション・サーバーでLOBを遅延フェッチする方法はありますか。

私はjvisualvmで自分のサーバーのプロファイルを作成しました。ほとんどのヒープはバイト配列で構成されていて、これらのバイト配列は自分のメインエンティティの1つと 'data'メンバ(DBのBLOB)として関連付けられています。

私はこのようなもので、そのエンティティを変更しようとしました:

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

が、その後、私は常にnullを取得します。

LOBを遅延フェッチする方法はありますか?

更新

私は、WebLogicアプリケーション・サーバーに付属のデフォルトのプロバイダを使用しています。私はサーバー上のJPA設定に触れていませんでした。

私のコードは現時点では非常に単純です(サンドボックスのようなもの)、em.find()(行IDによる)を使って自分のエンティティを見つけただけで、nullを返すmyEntity.getData()を呼び出します。

+0

この質問の投稿に使用したアカウントとは異なるアカウントでログオンしているため、あなたはコメントできませんでした。私はMODに通知しました。 – dandan78

+0

どのJPAプロバイダを使用していますか? fetch = LAZYにアクセスすると、クエリが発生するはずです。オブジェクトにアクセスする前にオブジェクトを分離/直列化していますか? – James

+0

@James:何らかの理由で私はあなたの答えにコメントを追加できないので、私はここで答えるでしょう:私はWeblogicアプリケーションサーバに付属のデフォルトプロバイダを使用しています。私はサーバー上でJPAの設定に触れていませんでした。私のコードは現時点では非常にシンプルで(サンドボックスの一種)、em.find(行IDに従って)を使ってエンティティを見つけてから、nullを返すmyEntity.getData()を呼び出します。 –

答えて

1

もう一度、同じユーザーにログインする際に問題が発生しました。とにかく、解決策が見つかりました:

私のサーバーのJPAプロバイダをTopLinkに切り替えましたが、私が得ることのできる最良のものは、非遅延のフェッチです(ただし、少なくともNULLまたは例外はありません)。

次に、別の方法を試しました。私は以前のエンティティがロブフィールドを保持していないが、新しいエンティティを保持していたが、私のロブフィールドを保持する同じテーブルのための新しいエンティティを作成した。私は1対1の関係と怠惰なフェッチを使って2つを接続し、それはうまくいった!

のみ、特定のマッピング動作するため、あなたがここに見ることができるようにそれは、私にいくつかの時間がかかった:

@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のでは動作しません。

関連する問題