0

私は、ウェブサイトと電子メールのコレクションを構築しているバッチ頂点クラスを持っているので、それらのコレクションを使用して、コレクションになる他のクエリをフィルタリングできます。すべてのコレクションを設定したら、スコープの最終ループを実行してビジネス プロセスを実行したいと考えています。

モックアップ:

for(Object o : scope)
{
listEmails.add(o.Email);
listWebsites.add(o.Websites);
}

Map<String, Account> accounts = Gather all accounts where website not in :listWebsties; //Website is key
List<String, Contact> contacts = Gather all contacts where email not in :listEmails; //Email is key

for(Object o : scope)
{
   Account = accounts.get(o.website);
   Contact = contacts.get(o.Email);

   Perform business logic here
}

問題は、このバッチを実行すると、何時間も処理が続くことです。かなり小さなデータベースで作業する場合、これはうまく機能します。しかし、大規模な環境で作業する場合、おそらくこれは最善の解決策ではありません。

より効果的なアプローチでバッチプロセスを高速化するのを手伝ってくれる人はいますか?

4

1 に答える 1

0

とにかくバッチapexクラス全体を投稿することはできますか?または、データをより理解するのに役立ちますか?マップから、すべてのアカウント(理論上)には固有のWebサイトがあり、すべての連絡先には固有の電子メールがあるように見えますか?私はあなたがそれらの地図を手で作ったと思いますか?つまり、アカウントをループしてmap.put(account.website、account)を実行しますか?

マップサイズを確認するためのシステムデバッグステートメントはありますか?account.get()を呼び出したときにアカウントがない、または連絡先がない場合はどうなりますか?

そしてビジネスロジック-それはもっとループしていますか?

また、静的な方法でバッチ変数を使用していますか?つまり、処理されたレコードの総数をカウントするためのカウンターを持つことができます。もしそうなら、あなたの変数はリストですか?もちろんそれは危険かもしれません。

また、スコープオブジェクトはどのオブジェクトですか?それは重要ではありませんが、あなたのスコープをアカウント自体または連絡先自体にしたいと思います。

system.debugステートメントをバッチに追加して、バッチが実行されていることを確認し、無限ループが発生している可能性がある場所を確認してみます。

于 2012-05-16T15:00:52.080 に答える