[Seasar-user:15191] OracleのBLOBについて

Satoru Ogura [E-MAIL ADDRESS DELETED]
2008年 7月 29日 (火) 15:44:51 JST


お世話になっております。
小椋と申します。

OracleのBLOB登録で過去ログを調べた結果、entityのデータ型をbyte[]にして登録する方法がありましたが、
比較的大きなファイルを登録する場合にOutOfMemoryが発生するため、
Oracleの作法にのっとってfor updateでファイルの登録をしようと思い、以下のクラスを作成しました。
dataSourceは複数使用している環境で、serviceクラスから呼び出され、トランザクションを引き継ぎます。

1.
一応、期待通りの動作をするのですが、
Connection conn = dataSource.getConnection();
で「論理的なコネクションを取得しました。」とログが出ますが、
「論理的なコネクションを閉じました。」のログが出力されずにトランザクション完了後にコミットされますが
問題ないでしょうか?
2.
dataSourceの取得方法はseasarの作法?にのっとっていますか?
3.
他にBLOB登録を実装された方でもっとスマートな方法があれば教えてください。

以上、よろしくお願い致します。

--------------------------------
環境
seasar 2.4.25
os:Red Hat Enterprise Linux AS Version4
tomcat:5.5.25
jdk:1.5.0.13

public class BlobLogicImpl implements BlobLogic {
    public void insertBlob(FileItem fileItem, String tableNm, Long fileId) throws Exception {
        DataSourceFactory dataSourceFactory = SingletonS2Container.getComponent(DataSourceFactory.class);
        DataSource dataSource = dataSourceFactory.getDataSource("oracle");
        Connection conn = dataSource.getConnection();

        String sql = "select hoge from " + tableNm + " where FILE_ID = ? for update";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setLong(1, fileId);
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            Blob blob = rs.getBlob(1);
            blob.truncate(0);
            OutputStream os = blob.setBinaryStream(0L);
            os.write(fileItem.get());
            os.flush();
            os.close();
        }
    }
}





Seasar-user メーリングリストの案内