2012-04-09 6 views
6

ResultSetExtractor内でgetIntを呼び出す際にパフォーマンスの問題があります。 GetIntは20000回と呼ばれます。 1つのコールのコストは0.15ミリ秒で、プロファイラ内で実行している間は全体のコストは24秒です。 SQLステートメントの実行には約8秒かかります(プライマリキーを使用したアクセス)。私はmysqlドライバのバージョン5.1.13、mysqlサーバ5.1.44、およびspring-jdbc-3.1.1を使用します。 パフォーマンスを改善するアイデアはありますか?ResultSetExtractor内のgetIntでのパフォーマンスの問題

mut.getMutEffect()[0]=(rs.getInt("leffect_a") != 0); 
    mut.getMutEffect()[1]=(rs.getInt("leffect_c") != 0); 
    ... 
    mut.getMutEffect()[19]=(rs.getInt("leffect_y") != 0); 
    mut.getMutReliability()[0]=rs.getInt("lreliability_a"); 
    ... 
    mut.getMutReliability()[19]=rs.getInt("lreliability_y"); 

私のスキームは、この

CREATE TABLE mutation (
... 
leffect_a BIT NOT NULL, 
lreliability_a TINYINT UNSIGNED NOT NULL, 
... 
leffect_y BIT NOT NULL, 
lreliability_y TINYINT UNSIGNED NOT NULL, 
... 
) ENGINE=MyISAM; 

編集のようになりますのgetInt内MethodeのgetIntWithOverflowCheckが高価であるように思われたと呼ばれています。この小切手を回すことは可能ですか?

答えて

2

は、ここではいくつかの提案です:

  • セットがかなり大量にフェッチサイズを:Statement.setFetchSize()。これにより、結果セットの処理中にデータベースサーバーへのラウンドトリップが削減されます。

  • select文は、例えば、

  • 一般的なテーブルの最適化をプロファイリングすることにより、最適であることを確認します正しいデータ型を使用していますか? leffect_aをBOOLEANに変更できるようです。

  • SELECTステートメントに不要な列が返されていないことを確認してください。

  • 使用PreparedStatement

  • スクロールおよび更新ResultSetを避ける回答を

+0

Statement.setFetchSize()はうまくいきました。どうもありがとう。 –

0

つの提案:

  1. ストア彼らは繰り返し使用されるローカル変数でgetMutEffect()getMutReliability()の結果。ホットスポットのjitは、インラインで重複した式を削除するかもしれませんが、私はこのことに頼らないことを明確にしています。
  2. 列名の代わりにindizesを使用してResultSetの値を取得する方が速い場合があります。あなたは索引付けする名前のローカル・マップを作成することもできます。いくつかのJDBCドライバでは、これはResultSetがマッピングを実行するよりも高速です。
+0

おかげで(どちらもデフォルトではありません)。プロファイラーは、列名を索引にマップするのが安価であることを示しています。また、getMutEffectにアクセスする際のパフォーマンス上の問題もありません。 –

関連する問題