1

少し前に作成してリリースしたアプリケーションを振り返っています。当時は最適化の時間はあまりありませんでしたが、今は少し最適化する時間がありました。

次のように、データベースからアイテムを含むオブジェクトをロードするJava DALクラスがあります。

sql = "SELECT COUNT(*) FROM projects";
count = execute(sql) // this returns the count

sql = "SELECT p.*, m.name AS clientName"
...
sql = sql + " FROM projects p"
sql = sql + " LEFT JOIN clients m ON p.clientID = m.id";

Project[] p = execute(sql, count); //this returns Project array

私が抱えている問題は、count スクリプトの実行に 4 秒以上かかり、select スクリプトの実行に約 2 秒かかることです。これはプレゼンテーション レイヤーに非同期で配信されますが、6 秒という待機時間は依然として非常に長い時間です (projects テーブルには約 300 レコードしかありません)。

ストアド プロシージャを追加し、スクリプトに "where active=1" などのフィルターを追加することで、おそらくこれを改善できると考えています。しかし、誰かが全体的により良い解決策を提案できるかどうか疑問に思っていますか?

ありがとう

編集: System.nanoTime() を使用してさらにテストを行ったところ、count スクリプトからの 4 秒 (3.8 秒) の最大のチャンクが 1 行の実行関数内で発生することがわかりました。

Connection c = getCon();

getCon 関数はこれを行います。

if (con == null) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(db_connect_string,db_userid,db_password);
}
...

だから私は今、新しい質問があります.db接続を取得するのに3.8秒かかるのはなぜですか?

4

2 に答える 2

2

SELECT COUNT(1) FROM projectsの代わりに使ってみてくださいCOUNT(*)。パフォーマンスが向上することが知られています。

編集

編集に関しては、接続プール メカニズムを使用していないようです。使用しない場合、呼び出しごとに新しい接続が試行され、コストがかかる可能性があります。一方、接続プールは接続のプールを維持し、必要なときにいつでも使用できるようにします。コードでa を実行するconnection.close()と、完全に切断されるのではなく、単純にプールに移動して再利用されます。

一般的に使用される接続プールのリストを確認することをお勧めします。私は DBCP または C3P0 を好みます。

注: WebSphere / WebLogic / JBoss などのアプリケーション サーバーを使用している場合は、既に処理されているため、これについて心配する必要はありません。アプリケーションDataSourceで直接の代わりに s を使用DriverManager.getConnection()し、アプリケーション サーバーで接続を構成するだけです。

于 2012-04-20T11:40:51.497 に答える
0

テーブルにインデックスがあることを確認してください。ただし、コードを変更する前に、数値を取得する自動テストをいくつか作成します。

次に、変更を加えるときに、実際の数値を比較して、何が最適かを確認できます。

そうすれば、たとえばストアド プロシージャを試してみると、それがどのように機能するかを確認できます。

于 2012-04-20T11:42:42.093 に答える