gpt4 book ai didi

java - 如何在 MySQL 后端的 Hibernate save() 调用上设置超时?

转载 作者:可可西里 更新时间:2023-11-01 06:37:58 25 4
gpt4 key购买 nike

上周,我们在一个基于 Java、Hibernate 的大型系统中遇到了一个问题。我们的后端 MySQL 数据库(托管在 Amazon RDS 上)有 5-10 分钟没有响应(它仍然可以接受连接,但由于硬件问题,其写入吞吐量降至零)。这段代码:

getSession().save(entity); //session is an instance of org.hibernate.Session

最后挂了大约 8.5 分钟。很明显,在我的特定情况下,此语句需要某种超时条件才能使其失败。我无法保证以后不会再遇到类似的硬件问题。

我应该提一下,我对 Hibernate 还是很陌生,所以我可能只是不明白一些事情,比如使用 save() 与使用 Criteria、Transactions 等之间的关联. 所以我发现了以下内容:

  • hibernate.c3p0.timeout 可用于在 C3P0 连接池上设置连接超时
  • getSession().getTransaction().setTimeout(...) 可用于使事务超时
  • getSession().createQuery(...).setTimeout(...) 可用于使查询超时
  • 我看过 JPA 2 javax.persistence.query.timeout,但我不完全确定它是我想要的(我也认为我的 Hibernate 版本不够新)

这些似乎都不是我想要做的(JPA 2 除外)。这看起来应该很简单。我在这里遗漏了什么吗?

谢谢!

最佳答案

我以前也找过类似的东西,但在后端使用的是 Oracle 而不是 MySQL。据我所知,在任何库中都没有任何机制,包括 JDBC 驱动程序。即使是您列出的超时,如 Transaction.setTimeout(),也不会按照您的预期进行。他们只是等待数据库语句完成执行,如果超过给定的超时,然后抛出 TimeoutException。如果您有一个无限期挂起的查询,那将毫无用处。我发现的唯一可能的开箱即用解决方案是在数据库本身上设置查询超时,这在 Oracle 上是一个全局设置,将影响对数据库的所有查询。这不是很有用。据我所知,要做你正在寻找的事情,你必须启动一个单独的线程来计时查询,并在它们达到超时时以某种方式中断它们。我还没有从 Oracle 或任何与数据库相关的库/框架中找到对执行此操作的任何支持。

关于java - 如何在 MySQL 后端的 Hibernate save() 调用上设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com