2013-08-06 38 views
5

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.

+0

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ọ –

+1

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. –

+0

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 –

Trả lời

1

hãy có một cái nhìn tại this article

Hình như, đối với một số lý do, OAS sẽ chỉ trả lại 86 byte giá trị BLOB, trừ khi bạn chỉ định một handler Lob vào cấu hình của bạn.

Bạn cũng có thể có thông tin thêm về this thread of CodeRanch mô tả cùng một vấn đề

Hope this helps!

+0

Chắc chắn đã giúp. Đối với những người muốn biết chi tiết cụ thể, tôi đã thay đổi loại thuộc tính 'nội dung' trong ánh xạ ngủ đông từ 'binary' thành 'org.springframework.orm.hibernate3.support.BlobByteArrayType', và sau đó tôi thiết lập thuộc tính 'lobHandler' của bean 'sessionfactory' để tham chiếu đến bean 'org.springframework.jdbc.support.lob.OracleLobHandler'. Bây giờ tôi có thể thấy rằng blob 360 byte của tôi được tải khi truy vấn chạy độc lập và trong ứng dụng OAS. –

+0

Vui vì nó đã giúp. Vui lòng đánh dấu câu trả lời là chính xác, vì vậy câu hỏi sẽ bị đóng. Cảm ơn bạn! –

+0

Tất nhiên, bây giờ bài kiểm tra đơn vị của tôi thất bại vì LobHandler không được khởi tạo đúng cho cơ sở dữ liệu cục bộ: -/Nhưng đó là một câu hỏi khác ... –

Các vấn đề liên quan