我正在使用Hibernate 3编写一个Web应用程序。
所以,过了一段时间,我注意到有些东西慢了。所以我测试了hibernate profiler,发现为了简单的操作,hibernate会进行不合理的db调用。原因当然是我加载了一个对象(这个对象有几个“父对象”),而这些“父对象”还有其他的“父对象”。所以基本上hibernate会加载它们,即使我只需要基本的对象。好的,所以我研究了延迟加载。这将我引向Lazyloading-exception,因为我有一个MVC webapp。
所以现在我有点困惑,我不知道我最好的方法是什么。基本上,我所需要的就是更新对象上的单个字段。我已经有对象键了。
我应该: 1.深入研究延迟加载。然后为open-session-view重写我的应用? 2.深入研究延迟加载。然后重写我的dao,更具体一点。例如,编写DAO方法,它将返回实例化的对象,这些对象只需要每个用例所需的内容?可能有很多额外的方法...3.自己动手做hibernate ? 4.现在真的想不出其他的解决方案了。有什么建议吗?
最佳实践是什么?
发布于 2012-04-26 01:26:13
书b=(书) session.load(Book.class,bookId);作者a=(作者) session.load(Author.class,authorId);b.setAuthor(a);session.save(b);
- only:session.setReadOnly(object, true)
。这将使Hibernate不在持久上下文中保留所选实体的原始快照以进行进一步的脏检查。
c3p0.max_statements
的物化路径和嵌套集,以便在池中启用PreparedStatment缓存,并在默认情况下关闭数据库的语句缓存。setMaxResults()
,setFirstResult()
)以及包含集合连接的查询,这将导致所有记录从数据库中拉出,分页将通过Hibernate在内存中发生。如果你想分页,理想情况下你不应该使用连接。如果无法避免,请再次使用批处理抓取。实际上有很多技巧,但我现在记不起更多了。
发布于 2017-12-15 16:45:53
你可以做很多事情来提高Hibernate性能,比如:
@OneToMany
而不是单向关系,使用D15 for @OneToOne
,对于持久性上下文大小和避免长时间运行的transactions发布于 2012-04-26 00:30:46
我相信你想复习一下这篇section in the Hibernate manual。
我希望你原来的问题是"...unreasonably多个数据库调用...“是他们所说的"N+1选择问题“的一个例子。如果是这样,他们就有了如何处理它的选择。
前两个可以在关联级别指定,而fetch类型可以在查询级别覆盖。你应该能够让你的查询只做你需要的,而不是更多,并使用这些工具用一个“好的”SQL查询来做。
https://stackoverflow.com/questions/10319205
复制相似问题