- 除非确实需要,否则不要使用联接。他们将不允许您既不使用延迟加载,也不使用2级缓存进行关联
- 对大型集合使用lazy =“ extra”,它不会检索所有元素,直到您询问为止,例如,也可以使用size()方法,而无需从数据库中获取元素
- 如果可能,请使用load()方法,因为它直到需要时才发出选择查询。例如,如果您有一本书和一本作者,并且想要将它们关联在一起,则不会发出任何选择,只能发出单个插入内容:
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缓存)
在您的Web应用程序中使用OSIV,因为它仅在/需要时才加载数据
- 对只读选项使用只读模式:
session.setReadonly(object, true)
。这将使Hibernate不在持久化上下文中保留所选实体的原始快照,以进行进一步的脏检查。 - 用户2级缓存和查询缓存,用于只读和只读数据。
- 使用FlushMode.COMMIT代替AUTO,这样Hibernate不会在更新之前发出select,但是要做好准备,以免导致写入过时的数据(尽管乐观锁定可以帮助您)。
- 看一下批量获取(批量大小),以便一次选择多个实体/集合,而不是针对每个实体/集合发出单独的查询。
- 进行“从实体中选择新的Entity(id,someField)”之类的查询,以便仅检索必填字段。看一下结果转换器。
- 必要时使用批处理操作(如删除)
- 如果使用本机查询,请明确指定哪些缓存区域应无效(默认情况下-全部)。
- 看一下树状结构的物化路径和嵌套集。
- 进行设置
c3p0.max_statements
以启用池中的PreparedStatment缓存,并启用数据库的语句缓存(如果默认情况下已关闭)。 - 如果可能,请使用StatelessSession,它可以克服脏检查,级联,拦截器等问题。
- 不要将分页(
setMaxResults()
,setFirstResult()
)与包含对集合的联接的查询一起使用,这将导致所有记录从数据库中拉出,并且分页将在Hibernate中发生在内存中。如果要分页,理想情况下不应该使用联接。如果您无法摆脱它,请再次使用批量获取。
其实有很多技巧,但是我现在还记得不多。



