EntityManager维护检索到的对象的一级缓存,但是如果您希望具有线程安全的应用程序,则需要为每个事务创建并关闭EntityManager。
那么,如果为每个事务创建并关闭了那些实体,那么1级缓存的意义何在呢?或者,如果您在单线程中工作,那么entityManager缓存可用吗?
一级缓存可用于其他目的。基本上,这是JPA放置从数据库中检索到的实体的上下文。
表现
因此,为了说明这一点,它避免了在事务处理期间已被检索为某种形式的缓存的记录被检索时,不必检索记录,从而提高了性能。另外,考虑延迟加载。您如何在没有缓存的情况下实现它来记录已经延迟加载的实体?
循环关系
此缓存目的对于实现适当的ORM框架至关重要。在面向对象的语言中,对象图通常具有循环关系。例如,具有雇员对象的部门,而那些雇员对象属于部门。
没有上下文(也称为工作单元),将很难跟踪您已进行ORMed的记录,最终将创建新的对象,在这种情况下,您甚至可能陷入无限循环。
跟踪更改:提交和回滚
此外,此上下文还会跟踪您对对象所做的更改,以便可以在事务结束时在以后的某个时间持久保存或回滚它们。没有这样的缓存,您将被迫在更改发生时立即将更改刷新到数据库,然后便无法回滚,也无法优化将其刷新到存储的最佳时机。
对象身份
对象标识在ORM框架中也至关重要。也就是说,如果您检索员工ID 123,那么在某个时候需要该Employee时,应该始终获取相同的对象,而不是包含相同数据的新对象。
此类缓存不应该由多个线程共享,如果这样的话,则会损害性能,并迫使每个人付出代价,即使使用单线程解决方案也可以。除此以外,您最终会得到更复杂的解决方案,就像用火箭筒杀死苍蝇一样。
这就是为什么如果您需要的是共享缓存,那么您实际上需要2级缓存,并且还有一些实现的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句