2013-08-06 5 views
5

Ich sehe etwas seltsam, wenn ich eine Abfrage in einer Anwendung in Oracle Application Server 10.1.3 mit Oracle10g ausgeführt ausführen.Gleiche Abfrage auf der gleichen Datenbank gibt verschiedene Ergebnisse auf OAS 10.1.3

Wenn ich führen eine Anweisung für die Datenbank direkt (zB eine Standalone-Anwendung, die eine DAO mit Hibernate implementiert ruft) Ich sehe die folgenden:

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_ 

Das gleiche DAO Betrieb, wenn jedoch wieder innerhalb der Applikationsserver laufen die folgenden:

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_ 

Sie können sehen, dass die Kennung und Zeitstempel der in beiden Fällen gleich sind, aber der Inhalt Blob ist anders: 360 Bytes im ersten Fall und 86 Bytes im zweiten Fall.

Die eigenständige Anwendung verwendet eine BasicDataSource, während die Anwendung auf dem Server eine JNDI-Datenquelle verwendet. Ich habe überprüft, dass die BasicDataSource die gleiche JDBC-URL enthält, die in der JNDI-Datenquelle verwendet wird. Beide Datenquellen verwenden dieselben Anmeldeinformationen.

Die Datenbankoperation im Anwendungsserver hat eine andere Ablaufverfolgungsausgabe, wobei NullableType::nullSafeGet() verwendet wird, um Informationen anstelle von org.hibernate.type Ablaufverfolgung anzuzeigen. Ich bin mir nicht sicher, ob das relevant ist.

Gibt es etwas Offensichtliches, das ich hier übersehen habe? Ich kann nicht sehen, warum ich unterschiedliche Ergebnisse erhalte, wenn ich dieselbe Abfrage in derselben Datenbank ablege.

edit: on OAS Ich habe einen JDBC-Verbindungspool konfiguriert, der die Verbindungsfactory-Klasse oracle.jdbc.pool.OracleDataSource verwendet, und die JDBC-Datenquelle ist eine verwaltete Datenquelle, die auf diesen Verbindungspool zeigt.

Ich denke, dass es ein Problem mit verschiedenen Oracle JDBC-Treibern geben kann? Die BasicDataSource für die eigenständige Anwendung verwendet den JDBC-Treiber oracle.jdbc.driver.OracleDriver und den Dialekt org.hibernate.dialect.Oracle10gDialect. Ich kann keinen Ort in der OAS-Verwaltung sehen, der die entsprechenden Werte anzeigt.

+0

Soweit ich weiß, basieren Sie auf der Protokollierung, um den Unterschied zu sehen. Bout, wenn Sie das Blob-Feld bearbeiten und den Inhalt untersuchen, sind die auch anders? Vielleicht ist es nur ein Unterschied auf ihren "toString" Darstellungen –

+1

Danke für die Antwort. Im Quellcode, wenn die Entity von Hibernate geladen wird, ist der Blob ein Byte-Array von 86 Bytes genau wie bei der Protokollierung. Ich habe die Werte dieses Bytearrays auch mit einem Debugger verifiziert. Es ist also kein Problem mit der Protokollierung. Die gleiche Abfrage führt zu unterschiedlichen Ergebnissen. –

+0

Ich habe einige Ergebnisse gemacht ... Ich werde es als Antwort posten –

Antwort

1

haben Sie einen Blick auf this article

Sieht aus wie aus irgendeinem Grund, OAS nur 86 Bytes des BLOB-Wert zurückgibt, wenn Sie eine LOB-Handler auf Ihrer Konfiguration angeben.

Sie können auch weitere Informationen über this thread of CodeRanch haben das gleiche Problem beschreibt

hoffe, das hilft!

+0

Sicher hat geholfen. Für diejenigen, die die Besonderheiten kennenlernen wollten, habe ich den Typ der Eigenschaft 'content' im Hibernate-Mapping von 'binary' in 'org.springframework.orm.hibernate3.support.BlobByteArrayType' geändert und dann die Eigenschaft 'lobHandler' festgelegt der Bean 'sessionfactory', um auf eine Bean 'org.springframework.jdbc.support.lob.OracleLobHandler' zu verweisen. Ich kann jetzt sehen, dass mein Blob von 360 Bytes geladen wird, wenn die Abfrage eigenständig und innerhalb der OAS-Anwendung ausgeführt wird. –

+0

Ich bin froh, dass es geholfen hat. Bitte markieren Sie die Antwort als richtig, damit die Frage geschlossen wird. Vielen Dank! –

+0

Natürlich scheitern meine Komponententests, da der LobHandler für die lokale Datenbank nicht richtig initialisiert wurde: -/Aber das ist eine andere Frage ... –

Verwandte Themen