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