Weblogic 10.3.1 + Oracle DB 10g: неверное имя пользователя / пароль при вставке большого объекта
Я работаю над проектом, использующим Hibernate 3.3.SP1 + Spring 1.2.6 на Weblogic 10.3.1 с Oracle DB 10g. Недавно мы перенесли 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. Поскольку приложение работает нормально, пока в БД не вставлен большой объект, можно с уверенностью предположить, что источник данных настроен правильно.
Пример сопоставления (я не могу опубликовать точный файл 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>
Код пытается сохранить некоторые значения больших объектов в трех таблицах. Ошибка появляется при попытке сохранить в первую очередь. Если я удаляю код для сохранения в первом, ошибка появляется на втором и так далее.
Единственное решение, которое я нашел до сих пор, состоит в том, чтобы установить начальную емкость соединений источника данных на максимальное количество соединений (15). В этом случае система кажется стабильной. Однако это решение неприемлемо, так как мы не понимаем природу проблемы.
Я пробовал это в четырех различных средах (Weblogic + Oracle). Ошибка не всегда появляется с одинаковой частотой (в некоторых системах она работает некоторое время, прежде чем не удается вставить большой объект). Кроме того, во время отладки я заметил, что если я увеличу вывод журнала (я просто добавил больше сообщений отладки в log4j), ошибка перестанет появляться. Это заставило меня думать, что это может быть проблема синхронизации между WLS и БД.
Есть ли у вас какие-либо идеи? Пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения.
Результат после включения вывода запроса Hibernate и изменения 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.