代码之家  ›  专栏  ›  技术社区  ›  Il-Bhima

永不更改表的最佳Spring/Hibernate配置

  •  6
  • Il-Bhima  · 技术社区  · 16 年前

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

    对于这种情况,我想知道处理这种情况的最佳方法性能是什么。我已经准备好了基础知识、只读ehcache、查询缓存和事务设置为只读(这对MySQL有什么作用吗?)我还可以看什么?哪种隔离模式,传播模式是最好的?我应该看看其他缓存解决方案吗?或者我应该简单地去掉所有这些,只将数据加载一次到一系列散列图中(希望这是最后的解决方法)?

    另一种可能(牵强?)解决方案是在内存中有一些/没有事务数据库,并让Hibernate连接到它。这种数据库引擎存在吗?

    我很感激你们的指点,你们的经验!

    5 回复  |  直到 16 年前
        1
  •  2
  •   Surya    16 年前

    为所有实体设置第二级CAHCE(检查Hibernate文档以了解缓存的各种配置/映射详细信息),配置查询缓存并在映射/使用只读会话中将其标记为不可变,这将使Hibernate在执行“事务性后写”和会话时不检查这些实体的修改。冲洗时。

    这是一个非常常见的场景,这是您应该做的全部工作。 您不必像echache那样开发自己的内存哈希映射缓存(二级缓存为您提供了多种存储选择),二级缓存可以为您做什么。 无事务数据库访问不提供任何性能方面的功能,所以我不担心它,让Hibernate来处理它。

        2
  •  2
  •   Paul Sonier    16 年前

    我以前处理过这类事情,关于数据的枚举表是不变的,坦率地说,最简单的事情就是将表设置为热切加载并处理它。除非表很大,否则从其他任何地方获得的优化都相对较小。不要轻蔑,但您的时间可能更好地用于优化系统的另一部分。

    也就是说,如果您的表特别大,那么您可能需要考虑另一种方法来取消引用它们所包含的数据;如果表数据很大并且确实从未更改过,那么您可能需要考虑另一种方法来填充对象树,而不是使用Hibernate;只为枚举创建一个类可能会有所帮助。并自行管理该引用的关联(即,没有休眠)。

        3
  •  1
  •   ShabbyDoo    16 年前

    我认为只读事务是一种休眠优化。如果Hibernate知道不必弄清楚是否更改了对象中的任何内容,那么它可以放弃一系列步骤(cglib修改类?)

        4
  •  1
  •   Alex Beardsley    16 年前

    我想你其他的大部分问题都得到了回答。但是,就隔离级别而言,如果从未插入或更新表,则可以使用读取未提交的隔离级别,该级别允许脏读、不可重复读和幻象读。但这些都不重要,因为数据永远不会改变。

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

    这将最大限度地释放行上的锁,并为您提供最佳性能,至少在锁定过程中如此。

        5
  •  -2
  •   Licky Lindsay    16 年前

    根据我的经验,这些类型的表需要从数据库中删除并转换为枚举或其他类型。不是因为性能,而是为了可维护性。信不信由你,与编写脚本来更改生产数据库中的数据相比,更改代码(在我的经验中也是如此)是一个更简单、更精简的操作。尤其是如果你不一定要自己控制数据库,尤其是如果你的公司甚至不控制它。