# java.sql.Blobとjava.sql.Clobの対応に関する但し書き

Derbyのロック機構(共有ロック)にて、java.sql.Blobやjava.sql.Clobが指し示すデータベース上の情報の更新や削除は防がれています。 しかしながら、Derbyの即時ロックの機構は、java.sql.Blobやjava.sql.Clobに対応する列が守られていない瞬間の存在を許すことがあります。 引き続くgetBlob/getClobおよびjava.sql.Blob/java.sql.Clobの呼び出しは未定義な振る舞いを起こす可能性があります。

さらにjava.sql.Blob/java.sql.Clobを持つトランザクションが、(他のトランザクションに対して)、対応行を更新することを防ぐ機構はありません。(この問題はgetXXXStreamメソッドにも存在しています。) java.sql.Blob/java.sql.Clobが開いていており、アプリケーションプログラムにて対応する情報の更新が妨げられた場合、失敗したことにより予期せぬ振る舞いが起きる可能性があります。

ResultSet getXXXメソッドのうち以下の何れかに該当するメソッドは、それらを同一のカラムに対して複数回呼び出してははなりません。

- getBlob
- getClob
- getAsciiStream
- getBinaryStream
- getUnicodeStream

これ等のメソッドは同一の対応するストリームを共有します。これらのメソッドを複数回呼び出すことにより、予期せぬ振る舞いを起こす可能性があります。 例を挙げます。

    ResultSet rs = s.executeQuery("SELECT text FROM CLOBS WHERE i = 1");
    while (rs.next()) {
        aclob=rs.getClob(1);
        ip = rs.getAsciiStream(1);
    }

サイズの大きな列の情報を扱うストリームはスレッドセーフではありません。従って、もしユーザが複数のスレッドを作成して、それらスレッドからストリームにアクセスした場合、未定義の動作を起こします。

Clobにはロケールによる振る舞いの違いがありません。

親トピック: java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応