2017-10-10 86 views
0

我有兩個簡單的轉換步驟。 1步(輸入表)對DB進行查詢,2步(Java類)處理結果。 2步需要很多時間(這在我的情況下是正常的),但1小時後,我收到關閉結果集的錯誤如何從pentaho kettle步驟中設置的結果中獲取所有結果輸入表?

服務器已關閉連接。如果結果集包含大量數據,則服務器期望客戶端相對較快地讀取結果集。在這種情況下,請考慮增加net_wait_timeout會話變量。 /處理你的結果集更快(檢查流結果集文檔以獲取更多信息) 2017/10/02 13:12:06 - 獲取數據單元.0 -

我認爲應該有一些中間步驟(或一些其他選項)得到比較快的所有結果從1步。你能幫我解決嗎?

+0

我有一個(不那麼)愚蠢的問題:是否真的是由於Java類的一步?我的意思是,「輸入表」通常因其他原因被鎖定。你可以用Dumy步驟替換第2步,看看它是否仍然鎖定。 – AlainD

+0

其他(不那麼)愚蠢的問題:你的java類可能會鎖定數據庫嗎?它是否使用任何'JDBC'? – AlainD

+0

是的,它使用 - (在某些情況下java類可以發送更新查詢到數據庫)。那麼這可能導致連接(和相應的結果集)關閉1步? – palandlom

回答

1

我猜你步驟2中鎖定相同的表作爲一個在步驟1

這就是PDI的,否則高效的架構的缺點之一。所有步驟同時啓動,並且最快的產生結果使得手能夠進入下一步。有了這個「做最快的第一個」的策略,當有大量的平均數或者平均數的加入時,你有時會打敗sql優化器本身(按比例)。

在這方面的主要缺陷是讀表,進行一些改造,並與truncate table檢查改寫在同一個表的結果。在這種情況下,在選擇啓動無限死鎖的輸入表之前,截斷操作需要幾毫秒。很長時間後,你決定殺死ETL,但那時數據已經丟失。

解決方案

  • 最佳實踐是使用PDI步驟,而不是使用現成的Java類重寫第二步。從長遠來看,這是我強烈建議的方式,但您可能有一些理由不遵循它。

  • 如果您的表很小,您可以在輸入和輸出之間放置一個blocking step

  • 如果表格很大,則可以使用sort row步驟代替阻止步驟。您並不想排序,但PDI需要查看最後一行以確保排序完成,然後才能將結果提供給下一步。這種排序將會削減硬盤上臨時塊中的數據,並且可以對tmp數據的存儲位置和方式進行一定的控制。

  • 您可以將表格複製到tmp表格(或文件)中,然後處理並刪除它。用工作來做到這一點,因爲在工作中,與變革不同,這個過程是順序的。

+0

謝謝,詳細解釋!我希望我的理解正確 - 我從java-class中刪除了執行UPDATE-query的代碼,並添加了從第2步接收某個字段並進行UPDATE查詢的3步(INSERT/UPDATE步驟)。 – palandlom

+0

恭喜。真誠。死鎖從來不是一個簡單的錯誤。 – AlainD

相關問題