ファイルから値を読み取るメソッド(読み取りメソッド)と、これらの値をDBに格納するデータアクセスオブジェクト(DAO)クラスから別のメソッドを呼び出すメソッド(格納メソッド)があります。私の質問は次のとおりです。readingメソッドで読み取られたすべての値をリストとしてstoreingメソッドに渡します(これにより、何百ものメソッド呼び出しが節約されますが、readingメソッドの反復でリストを作成する必要があります。メソッド)、または値ごとに保存メソッドを個別に呼び出す必要があります(つまり、数百のメソッド呼び出しがありますが、リストの作成と反復は必要ありません)。パフォーマンスとグッドプラクティスの観点から、どちらのアプローチがより効率的ですか?
6 に答える
ここでは、ハードディスクへのアクセスが最大のオーバーヘッドです。可能であれば、ハードディスクからの読み取りを1回実行します。そうでない場合は、バッファに読み込んで、使い終わったら補充します。この操作はスレッディングに適しています。試してみてください。
データベースリソースは限られています。パフォーマンスを向上させるには、データベースのヒットを最小限に抑える必要があります。
データベースヒットとリストの操作のコストを比較すると、無視できます。
したがって、リストを作成し、レコードごとに1つの操作を実行するのではなく、バッチ操作を実行してみてください。
データベースの相互作用を減らすことは常に良い習慣であり、パフォーマンスの高いオプションでもあります。
それらすべてを一度に読み、List
JDBC Batch Updateのようなものを使用して、それらすべてを一度にまたはバッチで保存する必要があります。
ただし、それらをすべて1つずつ実行することは間違いなくノーノーです。ネットワーク/IO操作が多すぎます。
確認する唯一の方法は、さまざまなオプションの時間を計ることです。ただし、このプロセスでデータベースにアクセスしているため、それが支配的である可能性があります。データベースアクセスを減らすバリアントは、最速になる傾向があります。両方のバリアントがデータベースに同じ影響を与える場合は、同じような時間がかかると思います。メソッドの呼び出しとオブジェクトの作成は、データベースとの通信よりも桁違いに高速です。
複数の値があるため、誰かが値を反復処理する必要があります。唯一の質問は:誰ですか?
一般的に言えば、DBアクセス(読み取りと書き込み)について話すとすぐに、リストの割り当て、リストの反復、およびいくつかのメソッド呼び出しの実行のオーバーヘッドは、1つのDB呼び出しのオーバーヘッドとして無視できます(数十億ではなく数百の呼び出しについて話します) 、 右?)。DB呼び出しは、ほとんどの場合、リモートプロシージャ呼び出しのようなものであり、データベースへの書き込みはディスクへの書き込みになります。これは、パフォーマンスを大幅に低下させるものです。
したがって、ほとんどの場合、DBへの呼び出しを最小限に抑えるとパフォーマンスが向上します。そして、DBアクセス層が完全なジョブを知っていれば、それはより簡単に行うことができます。したがって、DAOにリストを与えると、プリペアドステートメントやバッチ更新などを実行できます。ほんの少しの断片を考えると、それらのことを良いパフォーマンスで行うことは不可能です。
グッドプラクティスに関する質問に答えるには、アプリケーション全体でのDAOメソッドの使用を検討する必要があります。単一の起点から複数の値に対して複数回呼び出されている場合は、リストをメソッドに渡す必要があると思います。ただし、メソッドへの値呼び出しが1つしかないケースがさらにある場合は、その粒度で定義する必要があります。
DBアクセスについて他の人が言ったことは今でも当てはまります。可能であれば、複数のDBアクセスをバッチ処理してみてください。