使用 Spring TransactionTemplate 取消当前事务

Posted

技术标签:

【中文标题】使用 Spring TransactionTemplate 取消当前事务【英文标题】:Cancel current transaction with Spring TransactionTemplate 【发布时间】:2011-09-02 10:07:51 【问题描述】:

我正在使用连接池和 Spring TransactionTemplate。如果要关闭连接池,首先必须将所有连接返回到池中,这意味着必须调用connection.close()。我有一个线程使用TransactionTemplate 进行一些查询,另一个线程想要在连接池上调用一些关闭方法,但在执行此操作之前,它首先必须告诉TransactionTemplate 关闭所有连接(实际上只是将它们返回到池)。

如何在 Spring 中做到这一点以立即在使用的连接上调用 close?

【问题讨论】:

【参考方案1】:

如果您将 Hibernate 与 Spring 一起使用,请使用:

hibernate.connection.release_mode=after_transaction

如果您想在交易后立即释放连接。

hibernate.connection.release_mode=after_statement

如果你想在每个语句之后释放连接

这两个设置是我所知道的唯一可以使使用的连接比默认行为更快地释放的方法。至少就 Hibernate 而言。如果您使用的是其他库,请说明是哪个。

【讨论】:

我直接使用 TransactionTemplate,没有其他框架。 Mycode -> Spring transactions -> JDBC -> Database hibernate 是否会将这些设置转换为 Spring 框架上的一些调用? 我猜你正在使用 DataSourceTransactionManager。它是这样工作的。如果您在 TransactionTemplate 对象上调用 commit,它会将提交委托给它的 transactionManager 实现。无论发生什么 DataSourceTransactionManager 实现都会在最后清理事务。一种认为清理是连接释放。如果您将在日志记录中输入“调试”(org.springframework.jdbc 包)级别,您将看到您的连接在成功提交后刚刚被释放。如果您的数据源正在实施 SmartDataSource,则不会关闭连接。 是的,谢谢,我知道。也许我的问题不清楚:即使事务仍在运行,我也想关闭连接。选项 1 是在 linux 中使用“kill”,或者在 java 中使用 System.exit(0),但随后数据库中有大量从 conntion 池创建的未决连接。在退出程序之前,所有的连接都应该被强制关闭。我等不及交易结束了。我想要一些激进的近距离通话。 如果有人从您的机器上拔下插头,您是否也希望关闭您的连接?我认为你想要的总是不够的。连接池的实现通常使您能够销毁连接池。但这一切都假设您的计算机不会发生任何事情;)。另一件事是只运行一个释放无效连接的数据库作业。因此,如果您想激进,让数据库管理员完成他的工作并为您释放“真正”断开的连接。

以上是关于使用 Spring TransactionTemplate 取消当前事务的主要内容,如果未能解决你的问题,请参考以下文章

spring基础之二-;Spring IOC基本使用

Spring学习-----Spring使用@Autowired注解自动装配

Spring-使用JAVA的方式配置Spring-代理模式

Spring使用指南 ~ 5Spring AOP 使用简介

Spring使用指南 ~ 5Spring AOP 使用简介

Spring Framework,Spring Security - 可以在没有 Spring Framework 的情况下使用 Spring Security?