首页 > 解决方案 > Hibernate 带宽问题:比 SQL Developer 花费更多的时间

问题描述

我遇到了 Hibernate 发出的奇怪问题。我正在运行一个返回大约 300.000 个结果的简单查询

从 MY_TABLE 中选择 COLUMN_A、COLUMN_B、COLUMN_C、COLUMN_D、COLUMN_E、COLUMN_F,其中 COLUMN_G = 'Reporting';

在 SQL 开发人员中大约需要 1 分钟。但在休眠状态下需要 4 分钟。

    String queryString = "select COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D, COLUMN_E, COLUMN_F from MY_TABLE where COLUMN_G = 'Reporting'";
    Query query = entityManager.createNativeQuery(queryString, Reporting.class);
    List<ReportingScore> result = query.getResultList();

我不认为 Hibernate 创建对象的开销是问题的原因。

我注意到在 SQL Developer 执行查询时查看 Windows 任务管理器,带宽平均为 1.1Mbps

但是当 Hibernate 执行相同的查询时,它会以 300Kbps 的速度(慢 1/3)接收响应。

在此处输入图像描述

有谁知道为什么休眠数据传输比在这种情况下比 SQL Developer 慢?无论如何配置hibernate如何控制带宽?(我从来没有听说过)

我的应用程序是一个版本为 2.1.1.RELEASE 的 spring-boot 应用程序。

非常感谢

标签: hibernateoracle-sqldeveloper

解决方案


在将应用程序编译为 jar 中的 jar 然后使用 JRE8 运行时,我一直面临着与休眠速度完全相同的问题。解决方案是在最终的 jar 中(或 lib 目录中的依赖 jar)中包含具有扩展类的休眠库

从 JRE8 开始,jar 中的 jar 使休眠查询执行变得极其缓慢。

编辑:在我的情况下,这不是弹簧启动问题或休眠问题,而是 JRE8 如何处理 zip 放气,在使用以下插件设置由 maven 编译后,性能显着提高

...
        <build>

           <plugins>
              <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                  <execution>
                    <phase>package</phase>
                    <goals>
                      <goal>single</goal>
                    </goals>
                  </execution>
                </executions>
                <configuration>
                  <archive>
                    <manifest>
                      <addClasspath>true</addClasspath>
                      <mainClass>myapp.mainclass</mainClass>
                    </manifest>
                  </archive>
                  <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
                </configuration>
              </plugin> 
...
           </plugins>
        </build>
...

推荐阅读