在Hibernate中是否始终使用二级缓存?

在Hibernate中是否始终使用二级缓存?,hibernate,Hibernate,您是否总是在Hibernate中使用二级缓存,还是先不使用二级缓存,然后仅在性能下降时使用?我对Hibernate的使用一直是在另一个框架(例如Spring)的上下文中进行的,其中启用缓存几乎是微不足道的。许多这样的项目已经为一些关键的域类使用了缓存via 话虽如此,这是我们必须在资源之间进行权衡的另一个领域——平衡检索性能和内存使用。没有测量的优化一再被证明是糟糕的实践 收集有关应用程序性能的指标。然后决定如何解决慢点。缓存可能是您最不担心的问题。在我所使用的应用程序中,数据库在多个应用程序之

您是否总是在Hibernate中使用二级缓存,还是先不使用二级缓存,然后仅在性能下降时使用?

我对Hibernate的使用一直是在另一个框架(例如Spring)的上下文中进行的,其中启用缓存几乎是微不足道的。许多这样的项目已经为一些关键的域类使用了缓存via

话虽如此,这是我们必须在资源之间进行权衡的另一个领域——平衡检索性能和内存使用。没有测量的优化一再被证明是糟糕的实践


收集有关应用程序性能的指标。然后决定如何解决慢点。缓存可能是您最不担心的问题。

在我所使用的应用程序中,数据库在多个应用程序之间共享,其中一些应用程序根本不是Java。因此,在这种情况下,二级缓存对我来说不是一个选项,因为我永远不知道其他应用程序何时可以更新数据库。

如果你做得对(注意选择N+1等)在绝大多数情况下,如果没有二级缓存,性能应该是可以接受的

我们首先在没有二级缓存的情况下使用它,并且只在性能下降时使用它。

先让它工作,然后让它快速工作。如果不需要缓存,就不要实现它。

引用著名的Donald Knuth的话:“程序员浪费大量时间考虑或担心其程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。然而,我们不应该在这关键的3%上放弃我们的机会。”

如果您看到性能问题,只有这样您才能开始优化。您应该只优化最大的瓶颈,并在需要时逐步降低

然而,在大多数情况下,在NHibernate中实现此优化对调试和维护的影响可以忽略不计,并且通常只需对代码进行非常小的添加即可实现


如果您广泛依赖延迟加载,拥有只读表,不必担心与不使用NHibernate的应用程序的并发性,性能是一个问题,并且您知道如何使用二级缓存进行优化(这意味着您已经知道这个问题的答案),然后您应该使用第二级缓存。

现在有一个与此相关的hibernate特定问题。这就是臭名昭著的LazyInitializationException。基本上,当实体连接到持久性上下文时,您需要初始化所有惰性关联。有两种方法可以做到这一点:

  • 手动访问关系以强制加载它们
  • 使用指定联接提取的查询
  • 这两种方法会产生完全不同的代码段,因此将一个代码段迁移到另一个代码段可能是一项相当艰巨的工作。问题是,方法1.在不使用二级缓存时会导致大量查询,因此人们可以决定使用方法2,这会导致发烧查询。但是,当您稍后打开二级缓存时,会导致方法2中的查询不会从缓存中加载数据,但会将结果实体放入缓存中,这使得查询执行速度比没有缓存时慢。这会导致复杂的事情,例如必须使用查询缓存

    正因为如此,对我来说(在这个特殊的情况下)最好的方法是首先为所有实体启用缓存,这通常很简单,然后在开发过程中为不需要缓存的实体禁用缓存