Performance 我们可以在同一方法中使用多个Hibernate createSQLQuery而不关闭或刷新会话或事务吗

Performance 我们可以在同一方法中使用多个Hibernate createSQLQuery而不关闭或刷新会话或事务吗,performance,hibernate,session,Performance,Hibernate,Session,我对Hibernate会话的createSQLQuery()有疑问。在我的应用程序中,当在任何地方使用save或load方法时,我们使用beginTransaction(),然后使用commitTransaction(),但当使用createSQLQuery()时,按会话号使用beginTransaction()和commitTransaction()。即使使用相同的hibernate会话,也会在同一方法中与多个createSQLQuery()一起使用。使用createSQLQuery()是否正

我对Hibernate会话的
createSQLQuery()
有疑问。在我的应用程序中,当在任何地方使用save或load方法时,我们使用
beginTransaction()
,然后使用
commitTransaction()
,但当使用
createSQLQuery()
时,按会话号使用
beginTransaction()
commitTransaction()
。即使使用相同的hibernate会话,也会在同一方法中与多个
createSQLQuery()
一起使用。使用
createSQLQuery()
是否正确,即插入/更新不需要
beginTransaction()
commitTransaction()
,也不需要每次使用
createSQLQuery()
时刷新休眠会话?这样做不会影响应用程序的性能吗

谢谢,
Amit

如果您所做的只是只读操作(并且您确定表上不会有任何并发操作),那么您可以从同一Hibernate会话执行多个只读SQL查询。但是,如果表上可能存在并发操作,或者在读取之前插入/更新,则至少需要在操作之间刷新和清除会话,以防止脏读取

虽然不建议这样做,但在插入/更新数据时只需调用
beginTransaction()
。这样,如果插入/更新失败,Hibernate将通过在
TransactionManager
bean中包装操作自动回滚更改,该bean也会处理您的异常。虽然这不是一个好的做法,但在执行只读操作时,您不需要严格地调用
beginTransaction()
,因为您不会影响数据库状态。然而,这并不意味着不会抛出异常。如果抛出异常,并且您没有活动事务,则Hibernate无法执行任何异常处理


通常最好的做法是将每个查询封装在自己的DAO方法中,DAO方法管理Hibernate会话。虽然这确实意味着一次只能执行一个查询(每个方法调用),但它比在同一会话中执行多个查询更安全。根据经验,除非您的性能至关重要,否则数据完整性总是胜过性能。

这对我很有帮助。我的问题是,当我们在同一个方法中使用createSQLQuery(Insert/Update)进行多个hibernate会话时,所以我每次都需要刷新,或者在最后只需要一次刷新。另外,如果我对每个createSQLQuery.executeUpdate()使用beginTransaction和commitTransaction,那么我可以对下一个createSQLQuery使用相同的hibernate会话吗。我之所以问这个问题,是因为我在日志中看到了LockAcquisitionException,我觉得这可能是由于createSQLQuery中发生的插入和更新没有使用commitTransaction,并且会话没有在任何地方刷新。是的,如果您得到LockAcquisitionException,那么您需要在插入之间刷新会话