【问题标题】:Calculation on query vs programmatically查询计算与编程计算
【发布时间】:2014-07-13 02:25:10
【问题描述】:

我正在使用 Hibernate 作为 ORM 处理 Java EE 项目,我已经到了必须对我的类执行一些数学计算的阶段,例如 SUM、COUNT、加法和除法。

我有 2 个解决方案:

  1. 选择我的类并在我的代码中以编程方式应用这些操作
  2. 对我的命名查询进行计算

我想在性能和速度方面取悦,哪个更好?

谢谢你

【问题讨论】:

  • 我相信测试和决定都很简单。你有一些性能测试数据吗?
  • 好吧,我的课程又大又复杂,测试两种方式都不会那么容易(需要很多时间),所以我更愿意在这里提问,希望在我尝试测试之前找到答案自我
  • 大而复杂的课程闻起来很糟糕。首先修复它们:-p

标签: java database hibernate database-performance


【解决方案1】:

如果您要在同一事务中从数据库中加载要对其进行聚合的相同实体,则使用 Java 进行计算时性能会更好。 它为您节省了一次到数据库的往返行程,因为在这种情况下,您已经在内存中拥有实体。 其他好处是:

  • 更容易对计算进行单元测试,因为您可以坚持使用基于 Java 的单元测试框架
  • 以一种语言保持逻辑
  • 也适用于尚未持久化的实体集合

但是,如果您不打算加载要对其进行计算的同一组实体,那么如果您让数据库进行计算,那么几乎在任何情况下您都会获得性能提升。涉及的实体越多,性能优势就越大。

想象一下对今年订单中的所有订单项(可能有几百万个)进行汇总。

应该清楚的是,首先必须通过 TCP 连接(即使它在同一台机器中)将所有这些实体加载到 Java 进程的内存中,这比让数据库执行要花费更多的时间和更多的内存计算。

如果您的映射需要每个实体的额外查询,那么 Hibernate 将至少为每个实体额外往返一次数据库,在这种情况下,在数据库上使用 SQL 计算事物的性能优势会更大。

【讨论】:

  • 完美答案欧文,这就是我一直在寻找的,谢谢:)
【解决方案2】:

这些计算是基于实体(或数据)吗?如果是,那么您确实可以进行查询(甚至更快,使用 sql 查询 iso hql)。从性能的角度来看,IMO,存储过程大放异彩,但人们并不经常将它们与休眠一起使用。

另外,如果您有一些频繁的重复计算,请尝试在您的应用程序中使用缓存。

【讨论】:

  • 对实体进行计算,例如属性的加法和乘法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多