【问题标题】:Same query on same database gives different results on OAS 10.1.3同一数据库上的相同查询在 OAS 10.1.3 上给出不同的结果
【发布时间】:2013-08-06 03:21:28
【问题描述】:

当我在使用 Oracle10g 部署在 Oracle 应用服务器 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 操作返回以下内容:

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_ 

可以看到,两种情况下标识符和时间戳都是一样的,但是内容 blob 不同:第一种情况是 360 字节,第二种情况是 86 字节。

独立应用程序使用BasicDataSource,而服务器上的应用程序使用JNDI 数据源。我已验证 BasicDataSource 包含与 JNDI 数据源中使用的相同的 JDBC url。两个数据源使用相同的凭据。

应用服务器中的数据库操作有不同的trace输出,使用NullableType::nullSafeGet()显示信息而不是org.hibernate.typetracing。我不确定这是否相关。

我在这里忽略了什么明显的东西吗?我不明白为什么在同一个数据库上运行相同的查询时会得到不同的结果。

编辑:在 OAS 上,我配置了一个 JDBC ConnectionPool,它使用连接工厂类 oracle.jdbc.pool.OracleDataSource,而 JDBC 数据源是一个指向该连接池的托管数据源。

我认为不同的 Oracle JDBC 驱动程序可能存在问题?独立应用程序的BasicDataSource 使用JDBC 驱动程序oracle.jdbc.driver.OracleDriver 和方言org.hibernate.dialect.Oracle10gDialect。我在 OAS 管理中看不到任何显示等效值的地方。

【问题讨论】:

  • 据我了解,您是根据日志跟踪来查看差异的。如果您处理 Blob 字段并检查内容,是否也有所不同?也许这只是他们的“toString”表示不同
  • 感谢您的回复。在从 Hibernate 加载实体时的源代码中,blob 是一个 86 字节的字节数组,与日志记录完全相同。我也使用调试器验证了这个字节数组的值。所以这不是日志记录问题。相同的查询产生不同的结果。
  • 我有一些发现......我会发布它作为答案

标签: oracle hibernate oas


【解决方案1】:

请看this article

看起来,出于某种原因,OAS 只返回 86 个字节的 BLOB 值,除非您在配置中指定 Lob 处理程序。

您还可以在this thread of CodeRanch 上获得更多信息,描述相同的问题

希望这会有所帮助!

【讨论】:

  • 确实有帮助。对于那些想知道细节的人,我将休眠映射中的“内容”属性的类型从“二进制”更改为“org.springframework.orm.hibernate3.support.BlobByteArrayType”,然后设置“lobHandler”属性'sessionfactory' bean 引用'org.springframework.jdbc.support.lob.OracleLobHandler' bean。我现在可以看到,当查询在 OAS 应用程序中独立运行时,我的 360 字节 blob 已加载。
  • 很高兴它有帮助。请将答案标记为正确,以便问题关闭。谢谢!
  • 当然,现在我的单元测试失败了,因为 LobHandler 没有为本地数据库正确初始化:-/ 但这是另一个问题......
  • ... 和另一个问题:当我尝试使用 blob 编写实体时,我收到一个 spring 错误“java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with specified [javax.transaction. TransactionManager] 必需”。我不确定为什么需要事务来编写 blob。
  • 嗨,约翰。实际上,写入 blob 需要事务(至少在 oracle 中),因为在第一步中,您必须创建一个空 blob 并存储它。第二步包括打开一个流来更新 Blob 上的数据,最后提交事务。我已经使用普通 JDBC 完成了这项工作,整个过程都需要一个事务
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 2010-10-10
  • 2014-04-19
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多