2013-08-06 21 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操作を以下:第一の場合に360のバイトと第2ケース86バイト:

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_ 

あなたが識別子及びタイムスタンプが両方の場合で同じであるが、コンテンツブロブが異なることがわかります。

スタンドアロンアプリケーションではBasicDataSourceが使用され、サーバー上のアプリケーションではJNDIデータソースが使用されます。 BasicDataSourceにJNDIデータソースで使用されているものと同じJDBC URLが含まれていることを確認しました。どちらのデータソースも同じ資格情報を使用します。

アプリケーションサーバーでのデータベース操作では、トレース結果がNullableType::nullSafeGet()であるため、org.hibernate.typeトレースの代わりに情報が表示されます。それが適切かどうかはわかりません。

私はここで見落とされていることは明らかですか?同じデータベースで同じクエリを実行すると、結果が異なる理由がわかりません。

編集:on OAS接続ファクトリクラスoracle.jdbc.pool.OracleDataSourceを使用するJDBC ConnectionPoolを構成しました。JDBCデータソースは、その接続プールを指す管理対象データソースです。

異なるOracle JDBCドライバに問題があると考えていますか?スタンドアロンアプリケーションのBasicDataSourceは、JDBCドライバoracle.jdbc.driver.OracleDriverと方言org.hibernate.dialect.Oracle10gDialectを使用しています。同等の価値を示すOAS管理の場所は私には見えません。

+0

私が理解しているところから、あなたはログのトレースに基づいて違いを確認します。あなたがBlobフィールドを処理して内容を調べても、違いはありますか?たぶん、その "toString"表現の違いだけです –

+1

返事をありがとう。エンティティがHibernateからロードされるときのソースコードでは、blobはロギングごとに正確に86バイトのバイト配列です。デバッガを使ってこのバイト配列の値を検証しました。だからロギングの問題ではありません。同じクエリでは異なる結果が得られます。 –

+0

私はいくつかの発見をしました...私は答えとして投稿します –

答えて

1

ご使用の構成上のLOBハンドラを指定しない限り、何らかの理由で、OASは、BLOB値の唯一の86バイトを返し、同じようthis article

を見に見えるしていてください。

あなたはこのことができますthis thread of CodeRanch同じ問題を説明

・ホープの詳細情報をも持つことができます!

+0

確かに助けました。詳細を知りたい人は、hibernateマッピングの 'content'プロパティの型を 'binary'から 'org.springframework.orm.hibernate3.support.BlobByteArrayType'に変更し、次に 'lobHandler'プロパティを設定しました'sessionfactory' Beanの 'org.springframework.jdbc.support.lob.OracleLobHandler' Beanを参照します。私は、クエリがスタンドアロンでOASアプリケーション内で実行されたときに、360バイトのBLOBがロードされることを確認できます。 –

+0

うれしかったです。答えが正しいとマークして、質問が閉じられるようにしてください。ありがとうございました! –

+0

もちろん、LobHandlerがローカルデータベースに対して適切に初期化されていないため、私の単体テストは失敗します: - /それは別の質問です... –

関連する問題