2012-03-07 2 views
1

У меня около 1000 различных идентификаторов, для которых мне нужно запустить ниже hibernate запрос столько раз. На основе полученных записей (запись не обязательно должна присутствовать), я делаю немного обработки, прежде чем вводить ее в другую таблицу.Hibernate Performance Tuning

Проблема заключается в том, что весь процесс получения записей занимает около 20-25 секунд. Это нормально? Может ли запрос быть tweeked дальше, чтобы сократить время?

(В приведенном ниже запросе спящего режима будет выполняться для каждого идентификатора)

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 Я позаботился об этом ;-) – 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); 

Во-вторых, вы могли бы попытаться получить все целевые записи с одним запросом, 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); 

Тогда вы итерацию по результатам данного запроса и обрабатывать каждую запись, как вы переработал их ранее ,

В-третьих, если вы выполняете дополнительный SQL при обработке каждой отдельной записи, вы также должны их собирать и выполнять в batch.

+0

+1 для введения метода ** setParameterList **! Раньше я сам составлял список параметров комы! – ManuPK