gpt4 book ai didi

java - 频繁关闭和打开 hibernate session 是个好主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:31 26 4
gpt4 key购买 nike

我正在开发一个应用程序,它要求以频繁的时间间隔或触发器从数据库中读取实体的状态。但是,一旦 hibernate 读取状态,它就不会重新读取它,除非我明确关闭 session 并在新 session 中读取实体。

每次我想读取实体时打开一个 session 然后关闭它是个好主意吗?这会给应用程序和数据库带来多少开销(我们也使用 c3p0 连接池)?

在再次读取 session 之前简单地将实体从 session 中驱逐就足够了吗?

最佳答案

您还可以使用refresh 来重新加载实体。或者如@Bozho 所述,evictclear

使用连接池,打开和关闭 session 的开销并不大。需要时间的是构建 session 工厂。

关闭并重新打开 session 的问题是,如果我没记错的话,已经加载的对象仍然会分离。这对于延迟加载来说可能是有问题的。因此,最好保持 session 打开并使用 evictclearrefresh

请注意,如果您驱逐该实体,并且您访问一个已加载的此类实体,您仍将获得旧数据。

MyEntity e = session.load( ... );
...
session.evict(e); // remove entity from the cache
String p = e.myProperty; // still the value at the time it was loaded
e = sesssion.load( ... ); // latest value

在你的情况下,引入一个设计指南可能会更好,该指南规定无论何时操纵实体,都应该首先刷新它。

MyEntity e = session.load( ... );
...
session.refresh( e ); // refresh entity and cache
String p = e.myProperty; // latest value
e = sesssion.load( ... ); // latest value

上面的代码只是伪代码,我没有查过。

请注意,如果 session 打开了一段时间,缓存可能会增长,在这种情况下您可能仍然希望清除它。一般来说,最好保持 session 较短,以防止出现缓存增长问题,以及连接超时、事务超时和锁争用等问题。

关于java - 频繁关闭和打开 hibernate session 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2643037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com