【问题标题】:Where to set Hibernate FlushMode?在哪里设置休眠刷新模式?
【发布时间】:2020-01-29 16:33:25
【问题描述】:

我有一个 IntelliJ 项目,使用 Spring MVC 并将 Hibernate FlushMode 默认设置为 auto。
问题是:当我尝试使用 Web 界面从数据库中删除一个对象时,它工作正常,但是在我第三次这样做之后,界面变得没有响应(即使 Hibernate 收到删除该特定对象的命令使用该特定 ID),我必须重新启动 WildFly 服务器。

知道在哪里可以更改吗?有没有办法在配置文件中设置它,或者我必须调用一个方法来设置它?即使问题出在 FlushMode 本身。 问候

更新:在测试了几件事之后,我想我终于找到了问题的根源。如果我连续访问数据库超过 3 次,服务器将变得无响应。我该如何克服这个问题?

UPDATE#2:我发现问题在于,在 Dao 中,连接已打开但从未关闭(为了清楚起见,没有一行“session.close()”)。这就是为什么在从数据库中汇集三个之后,无论是添加项目,删除它们还是只是获取信息,服务器变得无响应。现在一切正常!

【问题讨论】:

    标签: spring hibernate spring-mvc flush


    【解决方案1】:

    我实际上没有正确理解您的问题。 第三次尝试从前端删除某些内容时,网页卡住了?第三次发出delete请求是被hibernate卡住了?可能对实际发生的事情/或您面临的问题有点清楚。

    回答你的问题 - 如何在休眠中设置FlushMode:

    1. 如果您使用 EntityManager -> entityManager.setFlushMode(FlushModeType.) -> JPA 支持 AUTO 和 COMMIT
    2. 如果您使用 SessionFactory:
      • sessionFactory.setHibernateFlushMode(FlushMode.) -> 从休眠 5
      • sessionFactory.setFlushMode(FlushMode.) -> 在休眠 5 之前 (注意:请检查文档以获取不推荐使用 setFlushMode 的休眠版本的准确版本。 Hibernate 支持 4 种刷新模式 -> AUTO/COMMIT/ALWAYS/MANUAL

    【讨论】:

    • 很抱歉我没有很好地解释自己。正如您所说,问题是我第三次尝试从前端删除某些内容时,网页卡住了。我在终端中没有错误也没有警告,所以它与 Hbernate 有关的事实只是我的假设。当然也可以是别的东西。
    • 重启你的服务器进行调试。然后调试可能导致问题的每一行。我认为冲洗与此无关。 Hibernate 启用了自动刷新,因此它会在需要时进行刷新。该文档讲述了这些条件,您可以阅读它 - docs.jboss.org/hibernate/stable/orm/userguide/html_single/…。也许它与您的查询有关。也检查您的查询。
    • 在我的脑海中,我能想到 - 查询执行需要时间来处理特定的资源/数据。如果您自己处理会话和事务而不关闭它们,则可能存在连接泄漏,因此您的池已耗尽。您实际上可以很好地检查数据库中的实时会话/事务。我
    • 我该怎么做?我的意思是,检查实时会话/交易。非常感谢您的提醒!
    • 我认为问题在于您的连接池大小已耗尽。一种解决方案是增加连接池大小,但这不是最佳解决方案。您需要管理您的连接资源。如果您使用 Session 连接到 DB,它们会环绕一个 Connection,即 -> 1 个会话,1 个与 DB 的连接,因此池中的 1 个连接线程已耗尽。如果您不关闭它们,它们将保持打开状态,从而导致资源泄漏,因此下一个后续调用正在等待空闲连接,但不能。因此,您的下一个请求会受到影响。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2014-02-03
    • 2010-11-13
    相关资源
    最近更新 更多