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.
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 –
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. –
Ich habe einige Ergebnisse gemacht ... Ich werde es als Antwort posten –