搜索
首页Java如何监控 Spring Data JPA 流

php小编柚子为您带来关于监控Spring Data JPA流的java问答。在开发过程中,监控数据流的实时情况对于系统性能优化和故障排除至关重要。本文将介绍如何监控Spring Data JPA流,让您更好地了解数据处理过程,及时发现问题并进行相应处理。一起来探讨如何有效监测Spring Data JPA流,提升系统稳定性和性能!

问题内容

我正在尝试按照此博客上的说明使用 spring data jpa 流。但是,我无法通过任何日志监控该过程或进度。当进程尝试批量提取数据时,我是否应该看到日志中打印多个 sql 查询?如果不是,那么我怎么知道所有行都没有一次性加载?

其他博客(例如此博客和此博客)建议我应该将 mysql 的 hint_fetch_size 设置为 integer.min_value ,我认为这可能是解决方案,但这会引发以下异常:

2024-01-29 14:40:20.843 警告 78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper:sql 错误:0,sqlstate:s1000 2024-01-29 14:40:20.843错误78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper:流式传输结果集com.mysql.cj.protocol.a.result.resultsetrowsstreaming@ 4ca63fa5 仍然活跃。当任何流结果集在给定连接上打开并使用时,不得发出任何语句。在尝试更多查询之前,请确保您已对任何活动的流结果集调用 .close()。 结束时间:48 org.springframework.orm.jpa.jpasystemexception:无法提取结果集;嵌套异常是 org.hibernate.exception.genericjdbcexception:无法提取 resultset 在 org.springframework.orm.jpa.vendor.hibernatejpadialect.converthibernateaccessexception(hibernatejpadialect.java:331)

这是我的存储库代码:

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})
@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

我想我想得到一个保证,如果以上是在 spring data jpa 中使用 stream 查询的正确方法,因为我自己无法可靠地监控 streaming 的性能?

更新

上述异常是由于在同一调用方法中重复调用 findallstream 方法而发生的。删除其中一个修复了该异常。

解决方法

我找不到任何日志配置来显示数据是否正在批量提取。但我确实找到了一种在本地测试性能的方法。

为了测试流功能,我需要访问包含数百万条记录的数据库。我使用 docker 映像 https://www.php.cn/link/7092d5eb1bbca1a22bdc69ba3f517e68 来使用 mysql 员工数据

设置 docker 映像后,我在将 mysql workbench 与服务器连接时遇到问题。看起来 docker 映像未配置为接受默认设置的 ssl 连接。我必须禁用 use ssl 标志才能建立连接。此设置出现在 mysql 工作台的 ssl 选项卡下。

应用程序中的连接字符串也必须按以下方式配置:

spring.datasource.url=jdbc:mysql://localhost:3307/employees?verifyservercertificate=false&usessl=false&requiressl=false

员工数据库中的数据包含一个名为 salaries 的表,该表约有 280 万行。

为了进行测试,我编写了一个小型 spring data jpa 应用程序,该应用程序在存储库类中具有以下方法以及一个简单的控制器来调用这些方法:

@Override
List<Salary> findAll();

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})

@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

然后我编写了一小段代码,将读取的数据转换为 json 对象,然后使用多个线程写回到文件中。这是为了模拟现实案例中的处理。

这是我观察到的。

  • 使用 list 方法时,内存使用量显着增加。最初的查询花费了大部分时间,但是当所有数据加载完毕后,实际的数据处理任务很快就完成了。

  • 使用 stream 方法时,对内存使用的影响几乎不明显。但总体来说,与list方法相比,完成处理部分的性能相似甚至更差。

结论

我的上述发现使我得出结论,存储库方法的 stream 返回类型仅应在存在内存不足风险时使用,即获得 out 内存异常 。否则,如果您的应用程序已经在足够大的服务器上运行,则对内存使用的总体影响几乎不会被注意到,并且只有在您的进程快速完成时才会是暂时的。

来自 intellij profiler 的内存使用统计信息

  • left -> 当列表方法运行时
  • 右 -> 当流方法运行时

以上是如何监控 Spring Data JPA 流的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:stackoverflow。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)