我正在尝试并行运行一些 JDBC 提取,但这失败了:java.lang.OutOfMemoryError: Java heap space
.
数据连接内存使用情况如何工作,如何解决此问题?
我正在尝试并行运行一些 JDBC 提取,但这失败了:java.lang.OutOfMemoryError: Java heap space
.
数据连接内存使用情况如何工作,如何解决此问题?
此处数据连接代理的内存使用情况实际上主要取决于 fetchSize 参数的值。根据Oracle JDBC 驱动程序文档,fetchSize
:
当此 ResultSet 对象需要更多行时,向 JDBC 驱动程序提供有关应从数据库中获取的行数的提示。
所以,agent的内存使用大概应该是:
number of JDBC extracts running in parallel x fetchSize x size of each row
不幸的是,不同的 JDBC 驱动程序中 fetchSize 的默认值差别很大。例如,某些版本的 Hive JDBC 驱动程序将其设置为 50,而其他较新版本的默认值为 1000。Oracle JDBC 驱动程序的默认值为 10。默认情况下,Postgres 将尝试一次获取整个 ResultSet。
因此,数据连接允许您配置fetchSize
值。这可以针对每个源和每个提取进行配置。
除了 OOM 错误,调优通常可以显着fetchSize
提高性能。但是,没有一种万能的解决方案,您必须尝试找出提取物的最佳参数值。它通常位于 500-5000 范围内。