【问题标题】:Hibernate with Oracle JDBC issue休眠与 Oracle JDBC 问题
【发布时间】:2009-10-22 19:23:15
【问题描述】:

我有一个选择查询,它需要 10 分钟才能完成,因为它运行了 10M 条记录。当我通过 TOAD 或使用正常 JDBC 连接的程序运行时,我会返回结果,但是在运行使用 Hibernate 作为 ORM 的作业时不会返回任何结果。它只是挂断了……即使在 45 分钟后?请帮忙

【问题讨论】:

  • 您是否真的希望我们基于此给您答复?

标签: oracle hibernate jdbc time


【解决方案1】:

您是说您尝试使用像 hibernate 这样的 ORM 检索 10M 条记录吗? 如果是这种情况,你有一个大问题,你需要重新设计你的应用程序,因为这不起作用,关于它为什么挂起,好吧,我敢打赌是因为它内存不足。

【讨论】:

  • 很抱歉,查询只返回满足条件的记录数的计数,因此我们不会将所有记录都放入内存中。查询本身需要时间。鉴于这是一个批处理作业,我们预计它需要一些时间。但是一旦生成了准备好的语句,即使在正常运行时或 toad 中的查询(10 分钟)之后,我们也不会恢复计数。
【解决方案2】:

您是否为 Hibernate 启用了 SQL 输出?您需要set hibernate.show_sql to true 才能执行此操作。

完成后,将生成的 SQL 与您通过 TOAD 运行的 SQL 进行比较。它们完全相同是否相同?

我要在这里冒险猜测一下,说它们不是,因为一旦生成 SQL,Hibernate 就不会做任何花哨的事情 - 连接是从池中获取的;准备好的语句被创建并执行 - 所以它应该与 JDBC 没有什么不同。

因此,最有可能的问题是如何优化您的 HQL。如果您需要任何帮助,您必须发布有问题的 HQL 以及适当的映射/表模式。对查询运行解释也会有所帮助。

【讨论】:

  • 感谢您的建议,我正在 TOAD 中运行由 Hibernate 生成的相同查询。
  • 您可以发布查询吗? HQL 和 SQL 都可以吗?以及您在 Hibernate 中运行它的代码?我很难想象 Hibernate 需要更长的时间来运行 same 查询。
  • 感谢您的回复,我有一个 Criteria 对象,它可以转换为 SQL 查询。查询是符合条件的对象的计数。当我在 DB 中有 50,000 条记录的开发环境中运行程序时,我得到了结果。但是当我在 Perf 中运行相同的程序时。具有类似 10M 记录的 env 查询永远不会返回。虽然,从 TOAD 运行相同的查询会产生结果。我的查询是这样的。
  • 选择 count(distinct A_.A_ID) as y0_, A_.C_ID as y1_ from A A_ inner join B B_ on A_.A_ID=B_.A_ID inner join C C_ on B_.B_ID=C_。 B_ID 内连接 D D_ on B_.A_ID=D_.A_ID 内连接 E E_ 和 B_.A_ID=E_.A_ID 内连接 F F_ on E_.E_ID=F_.E_ID 其中 A_.CRTE_DT 之间?和 ?和 D_.IS_DSW=?和 D_.ERR_CD=?和( C_.S_CD=? 或 C_.S_CD=? )按 A_.C_ID 分组
  • 您确定您在 TOAD 中运行的查询使用与 Hibernate 绑定的参数相同的参数吗?您是否启用了参数记录来验证这一点?此查询的另一个问题是您没有返回 single 计数;您正在返回一个分组列表。该列表中有多少个元素? TOAD 不会返回整个内容(它会分页),但 Hibernate 会。这意味着实例化 X 数组(或对象,如果您使用的是 ResultTransformer)对于大 X 来说可能相当昂贵。更不用说通过网络传输数据的时间了。
猜你喜欢
  • 2012-09-09
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2019-02-09
  • 1970-01-01
  • 2017-11-15
  • 2010-11-24
相关资源
最近更新 更多