use*_*237 15 java performance orm hibernate jpa
我正在使用Hibernate 3编写Web应用程序.
所以,过了一会儿我发现事情很慢.所以我测试了hibernate profiler,发现hibernate会为简单的操作做出无理的多次db调用.原因是我加载一个Object(这个对象有几个"父母"),这些"父母"有其他"父母".所以基本上hibernate会加载它们,即使我只需要基本对象.好的,所以我看着懒加载.这导致我进入Lazyloading-exception,因为我有一个MVC webapp.
所以现在我有点困惑,我最好的方法是什么.基本上我只需要更新对象上的单个字段.我已经拥有了对象键.
我应该:1.进入懒惰加载.然后重写我的应用程序以获得开放会话视图?2.挖掘延迟加载.然后重写我的dao更具体.例如,编写DAO方法,这些方法将返回仅与每个用例所必需的内容相关联的对象?可能是很多额外的方法...... 3.从头开始休眠并自己做吗?4.现在不能想到其他解决方案.有什么建议?
什么是最佳做法?
Sta*_*sev 26
如果可能,请使用load()方法,因为在需要之前它不会发出select查询.例如,如果你有一本书和一个作者,并且你想将它们关联在一起,这将不会发出任何选择,只有一个插入:
Run Code Online (Sandbox Code Playgroud)Book b = (Book) session.load(Book.class, bookId); Author a = (Author) session.load(Author.class, authorId); b.setAuthor(a); session.save(b);
使用命名查询(在您的hbm文件或@NamedQuery中),以便在每次查询期间不解析它们.在需要之前不要使用Criteria API(在这种情况下无法使用PreparedStatement缓存)
session.setReadOnly(object, true). 这将使Hibernate不在持久化上下文中保留所选实体的原始快照,以进行进一步的脏检查.c3p0.max_statements为在池中启用PreparedStatment缓存并启用数据库的语句缓存(如果默认情况下已关闭).setMaxResults(),setFirstResult())以及包含联接到集合的查询,这将导致从数据库中提取的所有记录和分页将由Hibernate在内存中发生.如果你想分页,理想情况下你不应该使用连接.如果你再也无法逃避它 - 使用批量提取.实际上有很多技巧,但我现在想不起更多.
正如我在本文或《高性能JavaPersistence》一书中所解释的那样,您可以执行许多操作来提高Hibernate性能,例如:
@OneToMany而不是单向,使用@MapsIdfor@OneToOne,使用Setfor@ManyToMany| 归档时间: |
|
| 查看次数: |
13057 次 |
| 最近记录: |