我有一些表格,我没有理由从应用程序中更新,所以我想阻止它发生在别的地方的错误,甚至意外。是否可以将表只读为休眠状态?
我看到@Immutable
注释,但它看起来像仍然允许插入和删除。我希望完整地把整张桌子(不仅仅是每个实体)视为石头。有没有简单的方法来完成这个?或者我误解了@Immutable
上的文档?
如果需要的例子,可以说有是MONTH
表的表,和Month
实体和APPOINTMENT
表相关的Appointment
实体。我绝不想在一个月内删除或插入一行。
我有一些表格,我没有理由从应用程序中更新,所以我想阻止它发生在别的地方的错误,甚至意外。是否可以将表只读为休眠状态?
我看到@Immutable
注释,但它看起来像仍然允许插入和删除。我希望完整地把整张桌子(不仅仅是每个实体)视为石头。有没有简单的方法来完成这个?或者我误解了@Immutable
上的文档?
如果需要的例子,可以说有是MONTH
表的表,和Month
实体和APPOINTMENT
表相关的Appointment
实体。我绝不想在一个月内删除或插入一行。
您是否尝试过只读缓存策略:
如果你的应用程序需要读取,但不能修改,一个持久化类的实例,一个只读缓存可以使用。这是最简单和最佳的执行策略。在集群中使用它甚至是安全的。
一种方法是使用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
)
这将是最会给你最好的表现,至少就腾出行锁的锁去
隔离级别的东西出现,以帮助将有助于性能,谢谢你让我知道。但它会实际防止读取/保存/更新? Transactional(readOnly = true)也很好理解,我认为在某些情况下,这可能是完美的。如果你可以为整个实体设定它,那将是完美的。 – derekv 2012-04-04 14:20:43
我不确定,但我不这么认为。它将允许插入,但是由于没有发出锁,所以速度很快。要处理INSERTS,请使用readOnly = true选项。它将在插入时引发异常。 我会确认答案是否正确。 – instanceOfObject 2012-04-05 05:22:50
感谢您的回答。我认为这是我需要的。从文档看,至少从性能的角度来看,这至少要考虑优化。我没有时间去验证自己是否做了我想要的主要事情,即防止应用程序尝试保存/更新/删除。当我有机会验证时,我会接受一个答案或发表评论。 – derekv 2012-04-04 14:18:16