0

我有一个相当庞大的项目,我正在尝试改进内存中的数据。本质上,我有一大堆对象,其中包含原语和其他存在于休眠状态的对象。大部分非 dao 代码依赖于通过休眠的延迟加载来动态地对对象进行水合。但是,由于一切都存在于内存中,我的对象没有加载,并且我得到了休眠延迟加载异常。

我可以通过手动浸入休眠和水合休眠对象来手动实现休眠延迟加载,但是该对象的对象图很大,包含数百种需要初始化和设置的类型。这似乎不切实际,我正在寻找一个可行的解决方案来解决这个问题。如果有人对此类问题或类似问题有任何提示、提示、解决方案或故事,我将不胜感激。

非常感谢。

4

3 回答 3

1

如果您手动处理会话,请尝试传递对象 ID(数据库中的行 ID)而不是完整对象。然后在您想要获取完整的 ORM 对象时执行数据库读取,并且仅将 ORM 对象保持在有限的范围内,以便在您完成后可以将其作为垃圾回收。这可能会为您节省一些内存。

这也有一个副作用,即限制您需要打开会话的时间量。因为您可以打开会话(我会推荐一个会话工厂)并根据需要关闭它们。但是,我认为打开和关闭会话可能会对数据库造成重大影响(我认为底层事务是真正的问题)。您可能想研究 JPA,据我所知,它不需要读取事务。Spring 也有一些不错的特性来自动化他们可能想要研究的事务和会话管理。

于 2009-05-18T19:35:35.007 回答
0

您可能已经关闭了会话。尝试在数据延迟加载时保持会话打开,或者如果无法做到这一点,请通过在集合上指定lazy="false" 属性来进行急切加载(lazy="true" 是默认值)。

于 2009-05-18T19:30:18.747 回答
0

最常见的原因LazyInitializationException是休眠会话已关闭。保持休眠会话打开,你应该没问题。

请注意,如果您使用 SpringHibernateTemplate加载对象,那么您加载的对象必然会被分离。如果你正在使用 Spring MVC 构建一个 webapp,一个简单的方法是使用OpenSessionInViewInterceptor

于 2009-05-18T19:46:14.970 回答