2015-11-20 18 views
5

我正在优化算法的过程中,我注意到Hibernate重复创建和释放更新语句,而不是重复使用它们。这些都来自相同的查询。Spring Hibernate,避免语句重复注册和关闭

15:57:31,589 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,591 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,594 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,595 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,597 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,599 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,600 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,601 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 

算法的主要方法有一个@Scope@Transactional注解。预期的行为是,如果出现任何问题,算法的更新是ROLLBACK

下面,算法使用@Service,它有一个不同的@Scope也是@Transactional。该服务是使用Hibernate更新数据库的服务,具有session.update(entity)。该文档说,默认情况下,嵌套事务如果存在,则重用该事务。

  • 上面的肯定是正确的吗?
  • 范围更改是否会产生问题?
  • 如何让Hibernate在事务处理过程中重复使用该语句?

感谢您的关注

回答

5

你的理解是正确的。范围与事务如何传播无关,Spring应该用代理控制事务,而不管范围如何。

使用Hibernate时无法重用语句。即使在手动编写JDBC代码时,也不推荐使用这种方法,因为这种方法的代码纠缠在一起。对此的常见答案是在JDBC连接池上使用预处理语句缓存。例如,使用Apache DBCP池,您可以使用poolPreparedStatementsmaxOpenPreparedStatements来控制它。与应用服务器捆绑在一起的池具有类似的设置。