2013-12-16 41 views
6

blobから読み取って書き込みを行う方法は、Hibernateを使用しています。 ブロブのデータ全体がメモリにbyte[]にロードされているため、現在はOutOfmemoryExceptionが取得されています。Hibernateでチャンク内のBLOBデータの読み込み/書き込み

より具体的には、大きいファイルをFileというデータベーステーブルに保存したいとします。

public class File { 
    private byte[] data; 
} 

私はFileInputStreamをでファイルを開き、その後、何? コンテンツをストリーミングする必要があることをHibernateに伝えるには、一度にbyte[]配列全体を渡すことはできませんか? byte[]の代わりにBlobを使用しますか?とにかく、どのようにコンテンツをストリーミングできますか?

読み込みに関しては、怠惰な読み込みのほかに、塊を読み込む必要がありますので、私はFileを取得すると、OutOfMemoryExceptionを取得しません。

私が使用しています:

  • のOracle 11.2.0.3.0
  • にHibernate 4.2.3最終
  • Oracleドライバ11.2

答えて

11

ブロブルートを行く、あなたが使用してみましたがある場合HibernateのLobHelpercreateBlobメソッドは、InputStreamになりますか? Blobを作成してデータベースに保持するには、FileInputStreamオブジェクトとバイト数を指定します。

ファイル豆/エンティティ・クラスが(JPAのアノテーションを使って)このようにブロブをマッピングすることができます:

@Lob 
@Column(name = "DATA") 
private Blob data; 

// Getter and setter 

とビジネスロジック/データアクセスクラスは、このようなあなたの豆/エンティティ・オブジェクトのブロブを作成することができますデータベースに永続化する前に、入力ストリームをクローズしないように注意しながら:

FileInputStream fis = new FileInputStream(file); 
Blob data = getSession().getLobHelper().createBlob(fis, file.length()); 
fileEntity.setData(data); 
// Persist file entity object to database 

を他の道を行くとチャンクでストリームとしてデータベースからBLOBを読むには、あなたはあなたに与えて、ブロブのgetBinaryStreamメソッドを呼び出すことができますInputStreamとあなたが設定することができます必要に応じて後でバッファサイズを変更します。

InputStream is = fileEntity.getData().getBinaryStream(); 

Struts 2 。

+0

hbm.xmlで@Lobを定義するにはどうすればいいですか(hbm.xmlファイルでドメインオブジェクトを定義します)? – Atticus

+0

@Lobアノテーションは、type = "blob"と言っている限り任意です。 –

+1

誰がそのストリームを閉じる予定ですか? –

関連する問題