Tôi thấy một điều gì đó lạ khi tôi chạy truy vấn trong một ứng dụng được triển khai trong Oracle Application Server 10.1.3, với Oracle10g.Cùng một truy vấn trên cùng một cơ sở dữ liệu cho kết quả khác nhau trên OAS 10.1.3
Khi tôi chạy một tuyên bố chống lại các cơ sở dữ liệu trực tiếp (ví dụ như một ứng dụng độc lập mà các cuộc gọi một DAO thực hiện với hibernate) Tôi thấy như sau:
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_
Cùng hoạt động DAO khi chạy trong máy chủ ứng dụng tuy nhiên lợi nhuận như sau:
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_
Bạn có thể thấy rằng các định danh và dấu thời gian là như nhau trong cả hai trường hợp, nhưng blob nội dung khác nhau: 360 byte trong trường hợp đầu tiên và 86 byte trong trường hợp thứ hai.
Ứng dụng độc lập sử dụng BasicDataSource
, trong khi ứng dụng trên máy chủ sử dụng nguồn dữ liệu JNDI. Tôi đã xác minh rằng BasicDataSource
chứa cùng một url JDBC được sử dụng trong nguồn dữ liệu JNDI. Cả hai nguồn dữ liệu đều sử dụng cùng một thông tin đăng nhập.
Thao tác cơ sở dữ liệu trong máy chủ ứng dụng có đầu ra dấu vết khác nhau, sử dụng NullableType::nullSafeGet()
để hiển thị thông tin thay vì theo dõi org.hibernate.type
. Tôi không chắc liệu điều đó có liên quan hay không.
Có điều gì hiển nhiên mà tôi nhìn thấy ở đây không? Tôi không thể thấy lý do tại sao tôi nhận được kết quả khác nhau khi chạy cùng một truy vấn trên cùng một cơ sở dữ liệu.
chỉnh sửa: trên OAS tôi đã định cấu hình JDBC ConnectionPool, sử dụng lớp nhà máy kết nối oracle.jdbc.pool.OracleDataSource
và nguồn dữ liệu JDBC là nguồn dữ liệu được quản lý trỏ đến hồ bơi kết nối đó.
Tôi nghĩ có thể có vấn đề với các trình điều khiển Oracle JDBC khác nhau? BasicDataSource
cho ứng dụng độc lập sử dụng trình điều khiển JDBC oracle.jdbc.driver.OracleDriver
và phương ngữ org.hibernate.dialect.Oracle10gDialect
. Tôi không thể thấy bất kỳ vị trí nào trong quản trị OAS hiển thị các giá trị tương đương.
Từ những gì tôi hiểu, bạn dựa trên nhật ký truy tìm để thấy sự khác biệt. Bout nếu bạn xử lý các lĩnh vực Blob và kiểm tra các nội dung, là khác nhau quá? Có lẽ nó chỉ là một sự khác biệt trên "toString" đại diện của họ –
Cảm ơn bạn đã trả lời. Trong mã nguồn khi thực thể được nạp từ Hibernate, blob là một mảng byte là 86 byte, chính xác theo ghi nhật ký. Tôi đã xác minh các giá trị của mảng byte này bằng cách sử dụng trình gỡ rối. Vì vậy, nó không phải là một vấn đề đăng nhập. Cùng một truy vấn mang lại kết quả khác nhau. –
Tôi đã thực hiện một số phát hiện ... Tôi sẽ đăng nó như là một câu trả lời –