性能:Java vs. 数据库

3
在编程时,经常需要做出决策,例如:
  • 我应该通过数据库条目动态生成菜单/按钮/导航栏,还是通过代码静态生成?
  • 我应该通过Java计算列表条目数,还是通过数据库查询?或者您可能会遇到更多的数据库与Java代码问题。
在Web应用程序中,关于性能问题,您的数据库应该做什么,哪些练习最好由Java代码完成。 也许区分小型和大型项目是合理的。

你会如何将菜单/按钮/导航放入数据库中? - Thorbjørn Ravn Andersen
请选择一个答案或者评论说明接受答案所需的步骤。 - Peter DeWeese
6个回答

5
扩展Ignacio的答案:DB通常具有较大的延迟(除非它物理上位于同一台机器上),因此您希望尽可能少地访问它。如果使用像Hibernate这样的ORM,您可以免费获得缓存和延迟加载;否则,您需要自己处理这些问题。
因此,从DB中获取GUI元素数据一次是可以的-然后在本地进行缓存和重用。如果您已经拥有所有元素,则最好在本地计算列表条目数。如果您仍需要查询,可以尝试将获取组合成一个查询。但是,如果您有一个巨大的列表,并且要从中选择相对较少的元素,则最好让DB完成工作并仅返回所选条目,而不是通过缓慢的网络连接压缩大量数据。

使用一个不错的二级缓存,结合两个世界的优点是最好的方法。 - BalusC

1

数据库很慢。Java代码相对非常快。如果可能的话,在内存中缓存从数据库中检索出的所有内容,可能使用像memcache这样的东西(如果适用;我不做太多Java网络编码)。


1

使用数据库存储可变数据。如果应用程序具有动态更改菜单/按钮/导航的功能,请将它们放入数据库中,否则不要这样做。内容管理系统通常会这样做。


1
我同意,这是一个商业问题。静态的东西放在代码中,可变的东西放在数据库中,并在显示时使用缓存(如果可能和必要)。 - snowflake

0

历史上,访问数据库速度较慢。对于通过网络访问的数据库(三层架构),尤其如此。因此,您应该避免访问数据库,限制数据库调用数量,并限制与数据库的连接数量(可能使用连接池)。典型的例子是Oracle、IBM DB2、MS SQL Server。新的数据库有MySQL和PostgreSQL。

有一些新的数据库可以在内存中运行或嵌入应用程序中。这会快得多。这方面的一些典型Java数据库是HSQLDB和较新的H2 database。它们也支持客户端/服务器操作,但它们不像上述的数据库那样成熟。

但是,即使是内存中和嵌入式数据库的速度也不及使用集合API的速度快。


0

你的数据库应该作为一个容器,用于保存需要持久化的应用程序数据。根据你所处理的数据类型,你需要做出决策:

对于应用程序配置(菜单项、标题栏名称、按钮名称等),考虑使用某种属性文件。如果你的应用程序有很多用户,并且每个用户的配置都不同或者属性过多,考虑使用数据库进行持久化。

对于模型数据(人员、地址等),考虑使用数据库,因为这是你的应用程序重要的信息。此外,你还可以从数据库中受益,以便在应用程序之外进行报告和分析。

总的来说,你应该在Java代码中对数据进行所有计算。这就是使用应用程序层进行业务逻辑和仅将数据库层用于持久性的概念。

在使用Java执行所有数据操作方面,有一个例外 - 大多数数据库在排序数据方面非常高效,如果需要,应在查询中使用它们来对结果集进行排序。根据数据集和表实现的情况,将数据在DB端排序并将其放入Java应用程序中的列表中可能比获取数据然后在Java中进行排序更有效。

最后,如果您需要频繁使用数据,请考虑在Java中缓存它,而不是从数据库查询。正如其他帖子所提到的那样,创建数据库连接、执行查询、解析结果比仅仅访问堆更加昂贵。

0

创建一个模型(气泡和线条),并确定作为核心数据的实体,使用它们创建类。这就是你放入数据库中的内容。(或者,你可以从实体模型创建关系模型。但这往往会导致程序中出现糟糕的模型。)

最初,不要担心缓存等问题,但我承认,在设计模型时考虑数据库性能也是好的。

制作一个清晰的模型,支持你想要做的事情。

关于数据库中的“配置”,请考虑以下几点:如果你的配置不能在不更改代码和重新部署的情况下进行更改,那么这就没有意义。真的。这只会使维护变得更加困难。

还要阅读以下内容:
http://thedailywtf.com/Articles/Soft_Coding.aspx

以及这个:

http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接