Oracle DB 10g を搭載した Weblogic 10.3.1 で Hibernate 3.3.SP1 + Spring 1.2.6 を使用するプロジェクトに取り組んでいます。最近、Hibernate を v3.0.5 から 3.3.SP1 に移行しました。LOB (BLOB または CLOB) を挿入しようとすると、(以前には発生しなかった) 奇妙なエラーが発生します。次のエラーが表示されます。
189202 [[ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)']
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
189202 [[ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)']
ERROR org.hibernate.util.JDBCExceptionReporter - Pool connect failed :
weblogic.common.ResourceException:
my.wls.datasource(dtJndiName): 0:
Could not connect to 'oracle.jdbc.OracleDriver'.
返されるメッセージは次のとおりです。
ORA-01017: invalid username/password; logon denied
It is likely that the login or password is not valid.
It is also possible that something else is invalid in
the configuration or that the database is not available.
その後、データソースは「破損」し、10 回連続して誤った接続試行を行った後、Oracle はアカウントをロックします。
アプリケーションには、Weblogic で事前構成されたデータソース以外に、データベースに接続するためのコードがまったくないことに注意してください。アプリケーションは LOB が DB に挿入されるまで正常に動作するため、データソースが適切に構成されていると想定しても安全です。
サンプル マッピング (正確な hbm.xml を投稿することはできません) は次のとおりです。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="my.model.persist">
<class name="LobTable" table="LOB_TABLE">
<id name="id" type="long" column="RS_ID" unsaved-value="null" length="10">
<generator class="native"></generator>
</id>
<property name="blob1" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" column="BLOB1"></property>
<property name="blob2" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" column="BLOB2"></property>
</class>
</hibernate-mapping>
このコードは、いくつかの LOB 値を 3 つのテーブルに永続化しようとします。最初に保存しようとするとエラーが表示されます。最初に保存するためのコードを削除すると、2番目にエラーが表示されます。
これまでに見つけた唯一の解決策は、データソース接続の初期容量を最大接続 (15) に設定することです。この場合、システムは安定しているように見えます。ただし、問題の性質を理解していないため、この解決策は受け入れられません。
これを 4 つの異なる環境 (Weblogic + Oracle) で試しました。エラーは常に同じ頻度で表示されるわけではありません (一部のシステムでは、LOB の挿入に失敗する前にしばらくの間動作します)。また、デバッグ中に、ログ出力を増やすと (単純に log4j にデバッグ メッセージを追加しただけです)、エラーが表示されなくなることに気付きました。これは、WLS と DB 間の同期の問題である可能性があると考えました。
あなたはなにか考えはありますか?さらに説明が必要な場合はお知らせください。
Hibernate クエリ出力を有効にし、最後に宣言されたフィールドとして LOB を持つように hbm.xml を変更した後の結果は、依然として同じエラーです。
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into LOB_TABLE_1 (field20, field21, field22, field23, field24, field25, field26, field27, field28, field29, field30, field31, LOB_FIELD_3, LOB_FIELD_4, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into LOB_TABLE_2 (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, LOB_FIELD_1, LOB_FIELD_2, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
105039 [[ACTIVE] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
105039 [[ACTIVE] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR org.hibernate.util.JDBCExceptionReporter - Pool connect failed : weblogic.common.ResourceException:
my.wls.datasource(dtJndiName): 0:
Could not connect to 'oracle.jdbc.OracleDriver'.
The returned message is: ORA-01017: invalid username/password; logon denied
It is likely that the login or password is not valid.
It is also possible that something else is invalid in
the configuration or that the database is not available.