最好的Spring / Hibernate配置,永不改变表格

时间:2009-05-26 22:12:51

标签: java mysql performance hibernate spring

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

我想知道这种情况下处理这种情况的最佳方法是什么。我有基础知识,只读ehcache,查询缓存和设置为只读的事务(这对Mysql做了什么呢?)。我还能看到其他什么?哪种ISOLATION模式,PROPAGATION模式最好?我应该看看其他缓存解决方案吗?或者我应该简单地取消所有这些并将数据加载到一系列的哈希映射中(这有望成为最后的手段)?

另一个可能的(牵强附会的?)解决方案是拥有一些内存/非事务数据库并让hibernate连接到它。这样的数据库引擎是否存在?

我很感激任何指点,经验你们有过!

5 个答案:

答案 0 :(得分:2)

我之前已经处理过这种事情,数据的枚举表没有改变,坦率地说,最简单的事情就是将表设置为急切加载并完成它。除非表格非常大,否则您可能从其他任何地方获得的优化相对较小。不要轻视,但你的时间可能更好地用于优化系统的另一部分。

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

答案 1 :(得分:2)

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

这是一种非常常见的情况,这是您应该做的所有事情。   您不应该处理在内存中散布自己的hashmap缓存(echache的二级缓存为您提供多种存储替代方案),即二级缓存可以为您做什么。  事务少数据库访问不提供任何性能,性能明智,所以我不担心它,让hibernate处理它。

答案 2 :(得分:1)

我认为只读事务是一种Hibernate优化。如果Hibernate知道它不会弄清楚你是否改变了对象中的任何东西,它可以放弃一堆步骤(CGLib修改类?)

答案 3 :(得分:1)

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

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

这将最大程度地释放行上的锁定,并且会给你最佳性能,至少就锁定而言。

答案 4 :(得分:-2)

根据我的经验,需要从数据库中删除这些类型的表并将其转换为枚举或其他内容。不是因为性能而是因为可维护性。信不信由你,改变代码(在我的经验中)是一种比编写脚本更改生产数据库中的数据更简单,更干燥的操作。特别是如果您不一定自己控制数据库;加倍,特别是如果你的公司甚至不控制它。