2012-03-07 18 views
1

私は約1000個の異なるIDを持っています。これは、以下を実行する必要がありますhibernateクエリを何度も実行します。検索されたレコード(レコードが存在する必要はありません)に基づいて、別のテーブルに入力する前に処理を少し行います。Hibernateパフォーマンスチューニング

ここでの問題は、レコードを取得するプロセス全体が約20-25秒かかることです。これは正常ですか?時間を短縮するためにクエリをさらにtweekedすることはできますか?

(以下クエリはIDごとに実行される休止)

String query = "select emp from Employee emp where emp.id = '"+id"' and emp.status.statusCd = 'A'"; 

注:従業員が約30列を含む表です。 status_cdとidはVARCHARです。

+0

パラメータをクエリに連結しないと、SQLインジェクションが発生するのを待っています。> _ < –

+0

@NathanHughes **は、** setParameterList **メソッドの紹介のために;-) – Chillax

答えて

4

まず、文字列連結を使用してSQLで可変フィールドを設定しないでください。

String queryString = "select emp from Employee emp where emp.id = :id and emp.status.statusCd = 'A'"; 
Query query = Session.createQuery(queryString); 
query.setInteger("id", 168); 

第二に、あなたは1つのクエリ、docsですべてのターゲットレコードを取得しようとすることができます:あなたは以前にそれらを処理したとして、あなたはこのクエリとプロセスの結果の上に各レコードを繰り返すだろう

String queryString = "select emp from Employee emp where emp.id in (:id) and emp.status.statusCd = 'A'"; 
Query query = Session.createQuery(queryString); 
Collection<Integer> idList = new ArrayList<Integer>(); 
query.setParameterList("id", idList); 

第3に、個々のレコードを処理している間に追加のSQLを実行する場合、それらを収集してbatchで実行する必要があります。

+0

+1を世話しました!私は昏睡状態のパラメータリストを自分で作成していました。 – ManuPK

関連する問題