【问题标题】:Best Spring/Hibernate configuration for never changing tables永不更改表的最佳 Spring/Hibernate 配置
【发布时间】:2010-10-29 02:53:55
【问题描述】:

我目前正在为我正在进行的项目使用 Spring+Hibernate+MySQL。我意识到有很多桌子永远不会改变。它们是静态的,在这些表上永远不会发生插入或更新,因此可以认为是不可变的。对这些表的所有访问都是通过实体集合和 hql 查询的延迟加载(可以是 Eager)。

我想知道在这种情况下,处理这种情况的最佳性能方法是什么。我有基础知识,只读ehcache,查询缓存和设置为只读的事务(这对Mysql有什么作用吗?)。我还能查看哪些其他内容?哪种隔离模式、传播模式最好?我应该寻找其他缓存解决方案吗?还是我应该简单地取消所有这些,只需将数据一次加载到一系列哈希图中(希望这将是最后的手段)?

另一种可能(牵强?)的解决方案是拥有一些内存/无事务数据库并让休眠连接到它。这样的数据库引擎存在吗?

我很感激你们的任何指点和经验!

【问题讨论】:

  • 这些表是否与其他发生变化的表相连?
  • 是的,完全正确。正如您正确指出的那样,这正是 Licky Lindsay 的解决方案在这种情况下不可行的原因。
  • 每个答案都提供了一些很好的信息,所以感谢大家!

标签: java mysql performance hibernate spring


【解决方案1】:

我认为您的大多数其他问题都已得到解答。然而,就隔离级别而言,如果您的表从未插入或更新,您可以使用 READ_UNCOMMITTED 隔离级别,它允许脏读、不可重复读和幻读。然而,这些都不重要,因为数据永远不会改变。

您可以在 spring javadocs (http://docs.huihoo.com/javadoc/spring/2.5/org/springframework/transaction/annotation/Isolation.html) 中查看每个的不同隔离级别和效果

这将最大程度地释放行上的锁,并为您提供最佳性能,至少就锁定而言。

【讨论】:

    【解决方案2】:

    为所有实体设置二级cahce(检查hibernate文档以获取各种配置/映射详细信息以进行缓存),配置查询缓存并将它们标记为映射中的不可变/使用只读会话,这将使hibernate不检查在执行“事务性后写”和会话刷新时对这些实体进行修改。

    这是一个非常常见的情况,这就是您应该做的所有事情。 您不必处理在内存中推出自己的 hashmap 缓存(像 echache 这样的二级缓存为您提供了多种存储选择),二级缓存将为您做些什么。 事务较少的数据库访问并没有为您提供任何东西,性能方面,所以我不会担心它,让 hibernate 处理它。

    【讨论】:

    • 这是我使用的方法,效果很好。您还应该配置查询缓存。纯二级缓存仅在您通过 id 访问实体时才有效。要从静态表中缓存“select *”,您需要使用查询缓存。
    【解决方案3】:

    我相信只读事务是一种 Hibernate 优化。如果 Hibernate 知道它不必弄清楚你是否更改了对象中的任何内容,它可以放弃一堆步骤(CGLib 修改类?)

    【讨论】:

      【解决方案4】:

      根据我的经验,这些类型的表需要从数据库中删除并转换为枚举或其他东西。不是因为性能,而是为了可维护性。信不信由你,与编写脚本来更改生产数据库中的数据相比,更改代码(再次以我的经验)是一种更直接、更简单的操作。特别是如果您不一定自己控制数据库;尤其是在您的公司甚至无法控制它的情况下。

      【讨论】:

      • 如果表参与 RI 约束,这可能是一个问题。您将把最好由 DB 处理的内容委托给您的应用程序。
      【解决方案5】:

      我之前已经处理过这类事情,使用不会改变的数据枚举表,坦率地说,最简单的事情就是将表设置为预加载并完成它。除非表非常大,否则您可能从其他任何东西中获得的优化都相对较小。不要轻视,但您的时间可能最好花在优化系统的另一部分上。

      也就是说,如果您的表特别大,您可能需要考虑另一种取消引用它们包含的数据的方法;如果表数据很大并且真的永远不会改变,您可能需要考虑使用 Hibernate 之外的另一种填充对象树的方法;简单地为枚举创建一个类并自行管理该引用的关联(即,没有 Hibernate)可能是有益的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多