一部の情報が不足していますが、それについては次のように推測しています。
行は、無限の割合で来ているわけではありません。
あなたはおそらくそれについてポーリングしています。つまり、sleep()
サイクルの間に何らかの種類を作成しています。
そうでない場合は、どちらの場合でもデータベース サーバーに高い負荷をかける可能性があることを知っておく必要があります。
したがって、何らかのスリープ (簡単にするために1秒としましょう) があると仮定すると、Java コードと格納されたルーチン コードとの間に大きな違いはないことがわかります。何故ですか?
- いずれにせよ、スリープはアイドル状態です。スリープ時間中はロックは保持されません。
- Java コードで発行するクエリは、ルーチン コードから発行する必要があり、その逆も同様です。
- コードの計算上の複雑さはほとんどありません (またはまったくありません)。
MAX(id)
ほとんどの場合、ターゲット テーブルのいくつかをチェックしている場合INSERT INTO ... SELECT ... FROM ... WHERE id > max_id_as_just_calculated
、 、または同様のものをチェックしています。
MySQL と Java の間で結果セットをやり取りする必要がないため、実行時間は実際にはルーチン コードにいくらか有利になる場合があります。さらに、INSERT INTO ... SELECT FROM
結果セットを Java オブジェクト/プリミティブに変換してから新しいクエリを準備INSERT
し、MySQL データに変換する代わりに、1 つのクエリで実行できます。
DB 負荷に関しては、実際の違いは見られませんが、ネットワーク配信時間 (ロックがまだ保持されている可能性がある時間) により、ルーチン側がわずかに改善されています。
考慮事項:
Java からこのプロシージャをどのように呼び出しますか? それは無期限に実行されます。それで、それにスレッドを捧げますか?
クラッシュしたとします (何らかのエラー) -- 再実行できるようにする必要があります (大したことではなく、考慮すべき問題です)。
イベントスケジューラを介して実行できます-これにより、上記の問題の多くが解決されます。ルーチンを介してループする代わりに、スケジューラにX秒ごとに呼び出させます。しかし、もう一度ロックを考えてみてください。
私自身の好み: おそらく Java コードを使用するか、このロジックを RDBMS に追加することに慣れている場合はイベント スケジューラを使用します。