2012-03-30 51 views
6

我有一些表格,我没有理由从应用程序中更新,所以我想阻止它发生在别的地方的错误,甚至意外。是否可以将表只读为休眠状态?

我看到@Immutable注释,但它看起来像仍然允许插入和删除。我希望完整地把整张桌子(不仅仅是每个实体)视为石头。有没有简单的方法来完成这个?或者我误解了@Immutable上的文档?

如果需要的例子,可以说有是MONTH表的表,和Month实体和APPOINTMENT表相关的Appointment实体。我绝不想在一个月内删除或插入一行。

回答

3

您是否尝试过只读缓存策略:

如果你的应用程序需要读取,但不能修改,一个持久化类的实例,一个只读缓存可以使用。这是最简单和最佳的执行策略。在集群中使用它甚至是安全的。

来源:19.2.2. Strategy: read only

+0

感谢您的回答。我认为这是我需要的。从文档看,至少从性能的角度来看,这至少要考虑优化。我没有时间去验证自己是否做了我想要的主要事情,即防止应用程序尝试保存/更新/删除。当我有机会验证时,我会接受一个答案或发表评论。 – derekv 2012-04-04 14:18:16

1

一种方法是使用READ_ONLY交易,方法是将@Transactional(readOnly=true)置于该方法之上。

http://www.codeinstructions.com/2009/04/read-only-transactions-with-spring-and.html

另一种方法:就隔离级别而言,如果您的表从未插入或更新过,则可以使用READ_UNCOMMITTED隔离级别,该级别允许脏读,不可重复读取和幻像读取。然而,由于数据永远不会改变,所以这些都不重要。

你可以看一下在春天的javadoc不同的隔离级别,每个的效果(http://docs.huihoo.com/javadoc/spring/2.5/org/springframework/transaction/annotation/Isolation.html

这将是最会给你最好的表现,至少就腾出行锁的锁去

+0

隔离级别的东西出现,以帮助将有助于性能,谢谢你让我知道。但它会实际防止读取/保存/更新? Transactional(readOnly = true)也很好理解,我认为在某些情况下,这可能是完美的。如果你可以为整个实体设定它,那将是完美的。 – derekv 2012-04-04 14:20:43

+0

我不确定,但我不这么认为。它将允许插入,但是由于没有发出锁,所以速度很快。要处理INSERTS,请使用readOnly = true选项。它将在插入时引发异常。 我会确认答案是否正确。 – instanceOfObject 2012-04-05 05:22:50