收集处理或数据库请求?哪一个更好

时间:2018-02-15 14:05:40

标签: java performance hibernate stream

这是我关于stackoverflow的第一篇文章,所以请对我好: - )

让我解释一下背景。我正在使用标准层(资源,服务,DAO Layer ...)开发Web服务。我使用JPA和hibernate实现我的对象模型与数据库。

对于A类父类和B类子类,大多数情况下,当我想在集合上找到对象B时,我使用streamAPI根据我想要的内容过滤集合。我的问题在这里更一般,通过请求数据库来搜索对象更好(从我的观点来看,这将导致对数据库的大量调用,但它将使用更少的CPU),或者相反通过搜索模型对象和处理集合(这将导致更少的数据库调用,但更多的CPU进程)

4 个答案:

答案 0 :(得分:0)

使用数据库返回您需要的数据,并使用Java对它们执行处理,这在JPQL / SQL查询中会很复杂。

数据库旨在比Java更有效地执行查询(流或否) 此外,从数据库中获取许多数据最终只保留其中的一部分效率不高。

答案 1 :(得分:0)

数据库通常更快,因为它针对请求特定数据进行了优化。通常会添加索引来加速查询某些字段。

TLDR:过滤数据库中的数据并从java处理它们。

答案 2 :(得分:0)

这不是一个容易回答的问题,因为有许多不同的因素会影响我决定是否转到数据库。首先,我认为可以公平地说,对于我在过去20年中所做的几乎所有应用程序而言,点击数据库获取信息是默认策略。最近(比如过去10年左右)通过Web服务调用访问数据也很常见。

对我来说,主要的问题是,"是否有任何情况我每次需要时都不会为数据点击外部资源(数据库,服务,甚至文件读取) ?"

因此,我将概述一些我会考虑的事项。

数据搜索空间是否非常小?

如果要搜索数十个不同记录的数据空间,则此信息可能是非数据库存储的候选者。另一方面,一旦你通过了相当小的记录,这种方法就变得越来越难以维持。这些"小套装的例子"可能像称呼(先生,女士,博士,太太,主)。我寻找很少变化的小数据集,作为一个懒惰的开发人员,我不介意输入配置文件。一旦我浏览了50条不同的记录(例如美国各州),我想从数据库或服务电话中提取该信息。

数据是否可缓存?

如果您有多个可以合法使用完全相同数据的请求,请在应用程序中利用缓存。检查服务的数据和预期使用情况,以便利用数据的规律性和可能的​​请求来尽可能地缓存数据。请记住考虑缓存键,应缓存项目的时间长度以及何时应逐出缓存项目。

在许多网络使用场景中,每个显示器可能包含相当大量的缓存信息和少量动态数据并不罕见。菜单和其他导航项目是缓存的理想选择。特定于用户的数据,例如电子商务应用中的合同特定定价通常是不良候选者。

您可以将一些数据预先加载到缓存中吗?

有些项目可以在整个应用程序期间读取一次并缓存。美国和/或加拿大省的名单就是一个很好的例子。这些几乎从不改变,因此一旦从数据库中读取,您很少需要再次读取它们。考虑可以在启动时加载此类数据的应用程序组件,然后将这些数据保存在适当的集合中。

答案 3 :(得分:0)

如果考虑延迟,数据库总是更慢。

所以你要问自己一些问题:

  • 数据库有多远(延迟)?
  • 数据集有多大?
  • 我如何处理它们?
    • 我有任何重大的运行时问题吗?
  

从我的角度来看,这会引起很多人对数据库的调用,但它会使用更少的CPU),或者通过搜索模型对象和处理过程来做相反的事情(这会导致数据库调用次数减少,但CPU流程更多

你的程序可能不是很高效的程序。如果您有任何重大的运行时泄漏,我建议您检查O-Notation

您的问题非常广泛,因此很难告诉您,因为您的用例可能是最好的。