2013-08-06 2 views
5

Я вижу что-то странное, когда я запускаю запрос в приложении, развернутом в Oracle Application Server 10.1.3, с Oracle10g.Тот же запрос в той же базе данных дает разные результаты в OAS 10.1.3

Когда я запускаю заявление против базы данных непосредственно (например, автономное приложение, которое вызывает DAO реализованный с спящим режимом) я вижу следующее:

select 
    documentco0_.CONTENT_ID as CONTENT1_63_0_, 
    documentco0_.TSTAMP as TSTAMP63_0_, 
    documentco0_.CONTENT as CONTENT63_0_ 
from 
    MySchema.MyTable documentco0_ 
where 
    documentco0_.CONTENT_ID=? 

[main] TRACE org.hibernate.type.LongType - binding '1768334' to parameter: 1 
[main] TRACE org.hibernate.type.TimestampType - returning '2013-08-05 17:31:32' as  column: TSTAMP63_0_ 
[main] TRACE org.hibernate.type.BinaryType - returning '7f587f608090cac6c9c68081818180b380b380807f5b80c3807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f40808b8880918091818191807f44809f8080818581818181818180808080808080808182838485868788898a8b7f44803590808281838382848385858484808081fd8182838084918592a1b1c18693d1e187a2f194b201112188a3c2314195d25170a4b3e2f202898a969798999aa5a6a7a8a9aab4b5b6b7b8b9bac3c4c5c6c7c8c9cad3d4d5d6d7d8d9dae3e4e5e6e7e8e9eaf3f4f5f6f7f8f9fa030405060708090a12131415161718191a22232425262728292a32333435363738393a42434445464748494a52535455565758595a6162636465666768696a7172737475767778797a7f5a808881818080bf80fef947bf520c730eff25ada7bd007c7f807a460efd87677f805625220aab7f59' as column: CONTENT63_0_ 

Той же операция DAO при запуске на сервере приложений однако возвращается следующее:

select 
    documentco0_.CONTENT_ID as CONTENT1_63_0_, 
    documentco0_.TSTAMP as TSTAMP63_0_, 
    documentco0_.CONTENT as CONTENT63_0_ 
from 
    MySchema.MyTable documentco0_ 
where 
    documentco0_.CONTENT_ID=? 

2013-08-06 12:49:46,484 TRACE [AJPRequestHandler-RMICallHandler-12] myuser:4 (NullableType.java:133 nullSafeSet()) - binding '1768334' to parameter: 1 
2013-08-06 12:49:46,500 TRACE [AJPRequestHandler-RMICallHandler-12] myuser:4 (NullableType.java:172 nullSafeGet()) - returning '2013-08-05 17:31:32' as column: TSTAMP63_0_ 
2013-08-06 12:49:46,500 TRACE [AJPRequestHandler-RMICallHandler-12] myuser:4 (NullableType.java:172 nullSafeGet()) - returning '80d48081818c808080818080808180808099ff0c809a5c9d809a5c9c80828082808080817f587f608090cac6c9c68081808080804818f7ef8081808080808080808080808080808080808080809a5c9c83408c508081' as column: CONTENT63_0_ 

Вы можете увидеть, что идентификатор и метка времени одинаковы в обоих случаях, но блоб содержание отличается: 360 байт в первом случае и 86 байтов во втором случае.

В автономном приложении используется BasicDataSource, тогда как приложение на сервере использует источник данных JNDI. Я проверил, что BasicDataSource содержит тот же JDBC-адрес, который используется в источнике данных JNDI. Оба источника данных используют одни и те же учетные данные.

Операция базы данных на сервере приложений имеет другой вывод трассировки, используя NullableType::nullSafeGet() для отображения информации вместо org.hibernate.type трассировки. Я не уверен, что это актуально.

Есть ли что-то очевидное, что я здесь не замечаю? Я не понимаю, почему я получаю разные результаты при запуске одного и того же запроса в одной базе данных.

Редактировать: в OAS Я настроил JDBC ConnectionPool, который использует фабрику соединений oracle.jdbc.pool.OracleDataSource, а источник данных JDBC - это управляемый источник данных, указывающий на этот пул соединений.

Я думаю, что может возникнуть проблема с разными драйверами Oracle JDBC? BasicDataSource для автономного приложения использует драйвер JDBC oracle.jdbc.driver.OracleDriver и диалект org.hibernate.dialect.Oracle10gDialect. Я не вижу никакого места в администрировании OAS, которое показывает эквивалентные значения.

+0

Насколько я понимаю, вы основываетесь на трассировке журнала, чтобы увидеть разницу. Бут, если вы обрабатываете поле Blob и просматриваете содержимое, тоже разные? Может быть, это просто разница в их представлениях toString –

+1

Спасибо за ответ. В исходном коде, когда объект загружен из Hibernate, blob представляет собой байтовый массив из 86 байтов, точно так же, как и для журнала. Я также проверил значения этого байтового массива с помощью отладчика. Таким образом, это не проблема регистрации. Тот же запрос дает разные результаты. –

+0

Я сделал некоторые выводы ... Я отправлю его в качестве ответа –

ответ

1

Пожалуйста, посмотрите на this article

Похоже, по какой-то причине, OAS возвращает только 86 байт значения BLOB, если не указать обработчик LoB на конфигурации.

Вы также можете получить больше информации о this thread of CodeRanch описании той же самой проблема

Надеются, что это помогает!

+0

Конечно, помогла. Для тех, кто хочет знать специфику, я изменил тип свойства content в сопоставлении hibernate с «binary» на «org.springframework.orm.hibernate3.support.BlobByteArrayType», а затем я установил свойство «lobHandler» в разделе «sessionfactory» ссылаться на компонент org.springframework.jdbc.support.lob.OracleLobHandler. Теперь я могу видеть, что мой блок размером 360 байт загружается, когда запрос выполняется автономно и в приложении OAS. –

+0

Рад помочь. Пожалуйста, отметьте ответ как правильный, поэтому вопрос закрывается. Спасибо! –

+0

Конечно, теперь мои юнит-тесты терпят неудачу, так как LobHandler неправильно инициализирован для локальной базы данных: -/Но это еще один вопрос ... –