加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 实体持续多久?

发布时间:2020-12-15 02:00:13 所属栏目:Java 来源:网络整理
导读:我试图了解JPA的工作原理.据我所知,如果你持有一个实体,该对象将保留在内存中,直到应用程序关闭.这意味着,当我查找以前持久化的实体时,将不会对数据库进行查询.假设没有进行插入,更新或删除,如果应用程序运行的时间足够长,则其中的所有信息可能会持久化.这是
我试图了解JPA的工作原理.据我所知,如果你持有一个实体,该对象将保留在内存中,直到应用程序关闭.这意味着,当我查找以前持久化的实体时,将不会对数据库进行查询.假设没有进行插入,更新或删除,如果应用程序运行的时间足够长,则其中的所有信息可能会持久化.这是否意味着在某些时候,我将不再需要数据库?

编辑

我的问题不在于数据库.我确信无法从应用程序外部修改数据库.我自己管理事务,所以数据一提交就会存储在数据库中.我的问题是:我提交后实体会发生什么?它们是否保存在内存中并像缓存一样?如果是这样,他们在那里待了多久?提交持久化后,我进行选择查询.这个选择应该返回我之前持久化的对象.该对象是从内存中获取的,还是应用程序会查询数据库?

解决方法

JPA不能仅使用持久性上下文(L1缓存)或显式缓存(L2缓存).它总是需要与数据源结合使用,而这个数据源通常指向一个持久存储到稳定存储的数据库.

因此,只要事务(JPA持久化操作所需)不提交,实体就只在内存中.之后,它将发送到数据源.

如果事务管理器是事务范围的(“正常”情况),那么L1缓存(持久性上下文)将关闭,并且实体不再存在.如果L1缓存以某种方式困扰您,您可以明确地管理它.有清除它的操作,您可以将读取操作(不需要事务)与写入操作分开.如果在读取时没有活动事务,则没有持久性上下文,实体永远不会附加,因此永远不会放入此L1缓存中.

但是,当事务提交并且其中的实体仍然可用于整个应用程序时,L2高速缓存不会被清除.必须明确配置此L2缓存,并且您作为应用程序开发人员必须指明应在其中缓存哪些实体.通过供应商特定的机制(例如JBoss Cache,Infinispan),您可以将最大值放在要缓存的实体数量上,并设置/定义所谓的驱逐策略.

当然,没有什么能阻止您将数据源指向内存中的嵌入式数据库,但这不在JPA的知识之内.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读