【问题标题】:Hibernate Issuing too many queries on MySQLHibernate 在 MySQL 上发出太多查询
【发布时间】:2011-03-26 11:31:31
【问题描述】:

我在 Spring 中使用 Hibernate 3.0 和 Mysql 5。我在 JBOSS 中配置了 JNDI 数据源并在应用程序上下文中使用它。

我的问题是 Hibernate 平均每秒向数据库发出 466.4 次查询,而网站上几乎没有任何负载。

ApplicationContext.xml sn-p 是

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
    <property name="jndiName" value="java:MyCustomDSName" />
    <property name="resourceRef" value="true" /> 
</bean>

我在 java 级别使用 JTA 事务。 欢迎任何帮助。

【问题讨论】:

  • 这些查询是什么?您的网络服务器每秒有多少次点击?
  • 每秒 466 次查询。这些查询是 HQL 查询。但我认为我有问题。也许是延迟初始化触发了查询。
  • 您可能希望启用 SQL 日志记录以查看实际情况。没有这个,你只是在黑暗中拍摄。
  • @ManishMudgal 如果您找到解决方案,请将其作为答案并接受

标签: mysql hibernate


【解决方案1】:

应该是其中之一

  • 您正在获取/处理太多请求 - 在开发中不太可能。
  • 您遇到了 N+1 选择条件 - 很常见。

请发布您的域模型,以及正在执行的查询。

【讨论】:

    【解决方案2】:

    这通常是由 N+1 查询问题引起的。但是,您可以使用单元测试断言机制来查找所有导致 N+1 查询问题的 JPA 和 Hibernate 数据访问方法,例如 this JUnit assert mechanism using datasource-proxy

    此外,最好将所有 EAGER 关联切换为 LAZY,因为如果您忘记在每个 JPQL 或 Criteria API 查询中加入关联,EAGER fetching 很容易产生 N+1 查询问题。

    LAZY loading 也可能导致 N+1 查询问题。当您在每次迭代时初始化父代理时迭代子实体集合时会发生这种情况。同样,这可以使用this JUnit assert mechanism using datasource-proxy 轻松检测到。

    【讨论】:

      【解决方案3】:

      您如何使用 JTA 事务?如果每个 Java 方法都被标记为需要一个新事务,这可以解释部分问题。此外,应该检查您的 Hibernate 对象关系。如果您有复杂的关系、模型关系中定义的大量急切加载的对象或循环关系,您可能会遇到更难解决的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 2013-06-10
        • 2011-03-26
        • 1970-01-01
        • 2018-01-08
        • 2012-09-03
        • 2015-07-15
        相关资源
        最近更新 更多