2017-10-10 5 views
0

私は2つのステップからなる単純な変換を持っています。 1ステップ(入力テーブル)はクエリをDBに、2ステップ(Javaクラス)は結果を処理します。 2ステップに時間がかかります(私の場合は正常ですが)1時間後に閉鎖された結果セットにエラーが発生しますペンタホのケトルステップで設定した結果からすべての結果を得るにはどうすればいいですか?

サーバーが接続を閉じました。結果セットに膨大な量のデータが含まれている場合、Serverはクライアントが結果セットを比較的早く読み取ることを期待しています。この場合、net_wait_timeoutセッション変数を増やすことを検討してください。 /結果セットをより速く処理する(詳細についてはストリーミング結果セット文書をチェックしてください)2017/10/02 13:12:06 - データセルの取得.0 -

私はいくつかの中間段階他のオプション)、すべての結果を1ステップから比較的速く得ることができます。あなたはそれを手伝ってもらえますか?

+0

私は(そうではない)愚かな質問をしています:それは本当にJavaクラスのステップですか?つまり、 'Input table'は他の理由でロックされることがよくあります。ステップ2を「Dumy」ステップで置き換えて、まだロックされているかどうか確認できますか? – AlainD

+0

他の(そうではない)ばかげた質問:あなたのJavaクラスは、データベースをロックすることがありますか? 'JDBC'を使用していますか? – AlainD

+0

はい - (JavaクラスによってはDBにUPDATEクエリを送ることができます)だから、それは1つのステップのための接続(および対応する結果セット)の終了につながる可能性がありますか? – palandlom

答えて

1

私はあなたのステップ2は、PDIのそうでなければ効率的なアーキテクチャの欠点の一つだステップ1.

で一つとして同じテーブルをロックしていると思います。すべてのステップが同時に起動し、結果を生成するのが最も速く、次のステップに手を貸します。この「最速の最初の」戦略では、総和または平均の結合が多数ある場合(pro rata)、SQLオプティマイザ自体を破ることがあります。

この点での主な落とし穴は、テーブルを読み取り、変換を行い、同じテーブルの結果をtruncate tableにチェックして書き換えることです。その場合、無限のデッドロックを開始する入力テーブルの選択の前に、数ミリ秒で切り捨てが行われます。あなたはETLを殺すことに決めましたが、その時点でデータは失われていました。

ソリューション

  • のベストプラクティスは、PDIのステップを使用してSTEP2を書き換えることなく、既製のJavaクラスを使用することです。それは私が長期的に強く推奨する方法ですが、それに従わない何らかの理由があるかもしれません。

  • テーブルが小さい場合、入力と出力の間にblocking stepを置くことができます。

  • テーブルが大きい場合は、ブロックステップの代わりにsort rowステップを使用できます。あなたは本当にソートする必要はありませんが、結果を次のステップに伝える前に、PDIはソートが完了したことを確認するために最後の行を調べる必要があります。ソートでは、ハードディスク上の一時的なチャンク内のデータを切断し、tmpデータの格納場所と格納方法を特定の制御で制御できます。

  • テーブルをtmpテーブル(またはファイル)にコピーし、処理してから削除することができます。ジョブでは、変換ではなく、ジョブがシーケンシャルなので、ジョブを使用します。

+0

ありがとう、詳細な説明はありません!私はそれが正しいことを願って - 私はJavaクラスからのUPDATEクエリの実行のためのコードを削除し、2ステップからいくつかのフィールドを受け取ってUPDATEクエリを作る3ステップ(INSERT/UPDATEステップ)を追加します。 – palandlom

+0

おめでとうございます。敬具。デッドロックは簡単なバグではありません。 – AlainD

関連する問題