DefaultLobHandler を推奨します。Oracle 9i データベースに対しても、10g/11g ドライバの使用を検討してください。DefaultLobHandler.setCreateTemporaryLob(boolean) は、この OracleLobHandler の実装戦略と直接同等であり、標準の JDBC 4.0 API を使用するだけです。ただし、ほとんどの場合、通常の DefaultLobHandler セットアップでも問題なく動作します。@DeprecatedSE public class OracleLobHandler extends AbstractLobHandler
LobHandler 実装。Oracle の JDBC ドライバーを使用する場合、必要に応じて独自の API を使用して oracle.sql.BLOB および oracle.sql.CLOB インスタンスを作成します。この LobHandler には、Oracle JDBC ドライバー 9i 以上が必要であることに注意してください。 ほとんどのデータベースは DefaultLobHandler で動作できますが、Oracle 9i (より具体的には、Oracle 9i JDBC ドライバー) は、独自の BLOB/CLOB API を介して作成された Blob/Clob インスタンスのみを受け入れ、さらに、PreparedStatement の対応する setter メソッドの大きなストリームを受け入れません。したがって、この LobHandler 実装のような戦略を使用するか、Oracle 10g/11g ドライバー (引き続き Oracle 9i データベースへのアクセスをサポート) にアップグレードする必要があります。
注意: Oracle 10.2 では、DefaultLobHandler はそのままでも同様に動作するはずです。Oracle 11g では、DefaultLobHandler.setStreamAsLob(boolean) や DefaultLobHandler.setCreateTemporaryLob(boolean) などの JDBC 4.0 ベースのオプションも利用できるため、この独自の OracleLobHandler は廃止されています。また、古いデータベースにアクセスする場合でも、新しいドライバーへのアップグレードを検討してください。推奨事項の概要については、LobHandler インターフェースの javadoc を参照してください。
ネイティブ JDBC 接続で動作し、それを oracle.jdbc.OracleConnection にキャストできるようにする必要があります。接続プールから接続を渡す場合 (Java EE 環境では通常の場合)、適切な NativeJdbcExtractor を設定して、基礎となるネイティブ JDBC 接続を自動的に取得できるようにする必要があります。LobHandler と NativeJdbcExtractor は別の問題であるため、別の戦略インターフェースで表されます。
Oracle クラスへの依存を避けるために、リフレクションを介してコード化されています。異なる Oracle ドライバー (classes12、ojdbc14、ojdbc5、ojdbc6) が異なる定数値を持つため、リフレクションを介して Oracle 定数も読み込まれます。この LobHandler はインスタンス化時に Oracle クラスを初期化するため、クラスパスにある Oracle JAR に依存したくない場合は、これを積極的な初期化シングルトンとして定義しないでください。この課題を回避するには、"lazy-init=true" を使用します。
DefaultLobHandler, setNativeJdbcExtractor(org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor)| 修飾子と型 | クラスと説明 |
|---|---|
protected static interface | OracleLobHandler.LobCallback 使用すべきではありません。 createLob で使用するための内部コールバックインターフェース。 |
protected class | OracleLobHandler.OracleLobCreator 使用すべきではありません。 Oracle データベース用の LobCreator 実装。 |
| コンストラクターと説明 |
|---|
OracleLobHandler() 使用すべきではありません。 |
| 修飾子と型 | メソッドと説明 |
|---|---|
InputStreamSE | getBlobAsBinaryStream(ResultSetSE rs, int columnIndex) 使用すべきではありません。 指定された ResultSet から、指定された列をバイナリストリームとして取得します。 |
byte[] | getBlobAsBytes(ResultSetSE rs, int columnIndex) 使用すべきではありません。 指定された ResultSet から指定された列をバイトとして取得します。 |
InputStreamSE | getClobAsAsciiStream(ResultSetSE rs, int columnIndex) 使用すべきではありません。 指定された ResultSet から指定された列を ASCII ストリームとして取得します。 |
ReaderSE | getClobAsCharacterStream(ResultSetSE rs, int columnIndex) 使用すべきではありません。 指定された ResultSet から、指定された列を文字ストリームとして取得します。 |
StringSE | getClobAsString(ResultSetSE rs, int columnIndex) 使用すべきではありません。 指定された ResultSet から指定された列を文字列として取得します。 |
LobCreator | getLobCreator() 使用すべきではありません。 新しい LobCreator インスタンスを作成します。 |
protected void | initializeResourcesBeforeRead(ConnectionSE con, ObjectSE lob) 使用すべきではありません。 読み取りが完了する前に、LOB リソースを初期化します。 |
protected void | initOracleDriverClasses(ConnectionSE con) 使用すべきではありません。 リフレクションを介して oracle.sql.BLOB クラスと oracle.sql.CLOB クラスを取得し、そこで定義されている DURATION_SESSION、MODE_READWRITE、MODE_READONLY 定数の値を初期化します。 |
protected void | releaseResourcesAfterRead(ConnectionSE con, ObjectSE lob) 使用すべきではありません。 読み取りが完了したら、LOB リソースを解放します。 |
void | setCache(boolean cache) 使用すべきではありません。 一時 LOB をバッファキャッシュにキャッシュするかどうかを設定します。 |
void | setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) 使用すべきではありません。 基礎となるネイティブ oracle.jdbc.OracleConnection を取得できるように、適切な NativeJdbcExtractor を設定します。 |
void | setReleaseResourcesAfterRead(boolean releaseResources) 使用すべきではありません。 LOB によって使用されるリソースを積極的に解放するかどうかを設定します。 |
getBlobAsBinaryStream, getBlobAsBytes, getClobAsAsciiStream, getClobAsCharacterStream, getClobAsStringcloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEprotected final Log logger
public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor)
oracle.jdbc.OracleConnection を取得できるようにします。これは、ネイティブの Connection 実装にキャストできないラップされた JDBC Connection ハンドルを返す必要がある DataSource ベースの接続プールに必要です。 実際には、この LobHandler は単一の NativeJdbcExtractor メソッド、つまり PreparedStatement 引数を持つ getNativeConnectionFromStatement を呼び出すだけです (抽出子が設定されていない場合は、PreparedStatement.getConnection() 呼び出しにフォールバックします)。
一般的な選択肢は SimpleNativeJdbcExtractor です。その Connection アンラップ (OracleLobHandler に必要な機能) は、多くの接続プールで機能します。詳細については、SimpleNativeJdbcExtractor および oracle.jdbc.OracleConnection の javadoc を参照してください。
public void setCache(boolean cache)
デフォルトは true です。
関連事項:
public void setReleaseResourcesAfterRead(boolean releaseResources)
true に設定すると、LOB 値を 1 回だけ読み取ることができます。リソースが閉じられているため、それ以降の読み取りは失敗します。 このプロパティを true に設定すると、クエリによって TEMPORARY 表領域の領域を占有する大きな一時 LOB が生成される場合や、LOB 読み取り用にドライバーによって割り当てられたメモリを解放する場合に役立ちます。
デフォルトは false です。
関連事項:
protected void initOracleDriverClasses(ConnectionSE con)
oracle.sql.BLOB クラスと oracle.sql.CLOB クラスを取得し、そこで定義されている DURATION_SESSION、MODE_READWRITE、MODE_READONLY 定数の値を初期化します。関連事項:
con - Oracle 接続は、Oracle ドライバがロードされたのと全く同じクラスローダーを使用するため public byte[] getBlobAsBytes(ResultSetSE rs, int columnIndex) throws SQLExceptionSE
LobHandlerResultSet.getBytes を呼び出すか、ResultSet.getBlob を操作する場合があります。rs - コンテンツを取得する ResultSetcolumnIndex - 使用する列インデックス null SQLExceptionSE - JDBC メソッドによってスローされた場合 ResultSet.getBytes(int)SEpublic InputStreamSE getBlobAsBinaryStream(ResultSetSE rs, int columnIndex) throws SQLExceptionSE
LobHandlerResultSet.getBinaryStream を呼び出すか、ResultSet.getBlob を操作します。rs - コンテンツを取得する ResultSetcolumnIndex - 使用する列インデックス null SQLExceptionSE - JDBC メソッドによってスローされた場合 ResultSet.getBinaryStream(int)SEpublic StringSE getClobAsString(ResultSetSE rs, int columnIndex) throws SQLExceptionSE
LobHandlerResultSet.getString を呼び出すか、ResultSet.getClob を操作します。rs - コンテンツを取得する ResultSetcolumnIndex - 使用する列インデックス null SQLExceptionSE - JDBC メソッドによってスローされた場合 ResultSet.getString(int)SEpublic InputStreamSE getClobAsAsciiStream(ResultSetSE rs, int columnIndex) throws SQLExceptionSE
LobHandlerResultSet.getAsciiStream を呼び出すか、ResultSet.getClob を操作します。rs - コンテンツを取得する ResultSetcolumnIndex - 使用する列インデックス null SQLExceptionSE - JDBC メソッドによってスローされた場合 ResultSet.getAsciiStream(int)SEpublic ReaderSE getClobAsCharacterStream(ResultSetSE rs, int columnIndex) throws SQLExceptionSE
LobHandlerResultSet.getCharacterStream を呼び出すか、ResultSet.getClob を操作します。rs - コンテンツを取得する ResultSetcolumnIndex - 使用する列インデックス SQLExceptionSE - JDBC メソッドによってスローされた場合 ResultSet.getCharacterStream(int)SEpublic LobCreator getLobCreator()
LobHandlerLobCreator インスタンス、つまり BLOB と CLOB を作成するためのセッションを作成します。作成された LOB が不要になった後、通常はステートメントの実行後またはトランザクションの完了後に閉じる必要があります。LobCreator.close()protected void initializeResourcesBeforeRead(ConnectionSE con, ObjectSE lob)
この実装では、releaseResourcesAfterRead プロパティが true に設定されている場合、非一時 LOB に対して BLOB.open(BLOB.MODE_READONLY) または CLOB.open(CLOB.MODE_READONLY) を呼び出します。
異なる動作が必要な場合、このメソッドはサブクラスによってオーバーライドできます。
con - 初期化に使用する接続 lob - 初期化する LOBprotected void releaseResourcesAfterRead(ConnectionSE con, ObjectSE lob)
releaseResourcesAfterRead プロパティが true に設定されている場合、この実装は、開いている非一時 LOB に対して BLOB.close() または CLOB.close() を呼び出し、一時 LOB に対して BLOB.freeTemporary() または CLOB.freeTemporary() を呼び出します。
異なる動作が必要な場合、このメソッドはサブクラスによってオーバーライドできます。
con - 初期化に使用する接続 lob - 初期化する LOB