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 的内存使用统计信息
以上是如何监控 Spring Data JPA 流的详细内容。更多信息请关注PHP中文网其他相关文章!