我有简单的转换,包括两个步骤。 1步(输入表)使得查询到DB和2步(Java类)处理结果。 2步需要很长时间(在我的情况下这是正常的)但是在1小时后我得到关闭结果集的错误
服务器已关闭连接。如果结果集包含大量数据,则Server期望客户端相对快速地读取结果集。在这种情况下,请考虑增加net_wait_timeout会话变量。 /更快地处理结果集(有关更多信息,请查看流结果集文档) 2017/10/02 13:12:06 - 获取数据单元格.0 -
我认为应该有一些中间步骤(或其他一些选项)来从1步获得相对较快的所有结果。你能帮帮我吗?
答案 0 :(得分:1)
我猜你的第2步是锁定与第1步中相同的表。
这是PDI其他高效架构的缺点之一。所有步骤同时启动,并且产生结果的最快速度可以帮助您完成后续步骤。有了这样的“先做最快”的策略,当有很多关于总和或平均值的连接时,你有时会击败sql优化器( pro rata )。
这方面的主要缺陷是读取一个表,进行一些转换,并在检查了truncate table
的同一个表上重写结果。在这种情况下,截断在选择输入表之前几毫秒完成,该输入表开始无限死锁。很长一段时间后你决定杀死ETL,但那时数据已经丢失。
解决方案:
最佳实践是使用PDI步骤重写step2而不是使用现成的java类。从长远来看,这是我强烈建议的方式,但你可能有一些理由不遵循它。
如果您的表很小,您可以在输入和输出之间放置blocking step
。
如果您的表很大,则可以使用sort row
步骤而不是阻止步骤。您真的不想排序,但PDI需要查看最后一行以确保排序完成,然后才能将结果提供给下一步。排序将切断硬盘上临时块中的数据,您可以对tmp数据的存储位置和方式进行一定的控制。
您可以将表复制到tmp表(或文件)中,然后处理并删除它。使用工作来做到这一点,因为在工作中,与转换不同,这个过程是顺序的。