Hibernate:相对于自定义 @Transactional(timeout) 的默认事务超时

Posted

技术标签:

【中文标题】Hibernate:相对于自定义 @Transactional(timeout) 的默认事务超时【英文标题】:Hibernate: default transaction timeout with respect to custom @Transactional(timeout) 【发布时间】:2018-01-22 10:10:33 【问题描述】:

在我的项目中,它是基于 Spring Boot、Hibernate 和 PostgreSQL(使用 HikariCP)构建的,我想为整个应用程序设置事务超时 -> 我只想终止所有花费太长时间的事务,因为这些事务可以由用户请求启动,并且很容易以耗尽整个连接池而告终。

我知道如何设置默认事务超时的一些方法,例如通过 Spring Boot 属性 spring.transaction.default-timeout 或在 HibernateTransactionManager 上设置 defaultTimeout 属性。 两种解决方案都运行良好。

但是,项目中有很多地方可以进行长事务,我希望那里没有超时(覆盖默认行为)。我尝试在这些地方使用@Transactional 和指定的timeout 参数:@Transactional(timeout = 10),但它不会覆盖仍然使用的默认全局值。

如何实现我的要求最糟糕的方法是定义一个自定义注释,该注释将使用默认超时覆盖@Transactional,并在整个项目中使用此注释,出于多种原因我不想这样做。

目前,我不知道任何其他解决方案。没有更好的吗? 谢谢。

【问题讨论】:

事务没有超时是可以的,但是请求超时呢?所以想象一下 1 小时的交易。数据库可以工作,但可能会发生请求超时 在我的项目中正常的长事务不是基于用户请求,而是主要是启动的同步,例如通过 cron。这就是为什么我不希望那里有任何超时。 【参考方案1】:

我建议将长时间运行的作业转移到单独的服务应用程序中,您可以在其中设置更长的事务超时时间。

【讨论】:

以上是关于Hibernate:相对于自定义 @Transactional(timeout) 的默认事务超时的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Validate 不作用于自定义验证值

如何将 NSPredicate 应用于自定义 XLForm 行?

应用于自定义 QAbstractItemModel 的外部选择

将语义应用于自定义 git 流

如何选择样式并将其应用于自定义标签

自定义 Bootstrapper UI,类似于自定义的 wix UI