Я уверен, что может улучшить производительность следующего FindByName запроса спящего режима:Что такое быстрый запрос findByName с hibernate?
public List<User> findByName(String name) {
session.createCriteria(User.class).add(Restrictions.eq("name", name)).list();
}
Узким является то, что метод FindByName и я не могу использовать идентификатор вместо.
В моем случае я знаю, что имя уникально, но добавление аннотации индекса к атрибуту имени не улучшило производительность. Я сделал следующее:
class User {
@Index(name = "nameIdx")
private String name;
}
Каким образом я должен улучшить или даже более важно: в каких путях я должен улучшить его первым? Мне понадобится полный объект со всеми коллекциями (layz или нет) и deps этого класса.
Или я могу улучшить его, если хочу несколько объектов пользователя (и знаю несколько имен)?
Update1:
@Index аннотации не улучшают производительность, так как база данных уже индекс, из-за моей уникальное ограничение аннотации:
@UniqueConstraint(columnNames = {"name"})
UPDATE2:
Внимательно прочитайте ответы!
С помощью журнала SQL я увидел, что реальная проблема заключалась в том, что было сделано много предложений по обновлению и вставке, хотя я не совершал транзакций и не выполнял их. Причиной, что было то, что я сделал (в цикле):
User u = findByName(name); if(u == null) attach(u = new User(name));
и так зимуют потребности промывать вновь созданных пользователей к БД перед каждым запросом FindByName. Я решил это с помощью собственного кэша (LinkedHashMap).
Еще одно усовершенствование я сделал через наконечник Jens Шаудера:
public Collection<User> findByNames(Collection<String> names) { return session.createCriteria(User.class). add(Restrictions.in("name", names)).list(); }
Дальнейшее улучшение может быть сделано при определении некоторых из коллекции пользователя не ленивых:
Read this answer, чтобы получить даже лучший вариант.
Последнее и самое важное для меня: замена мои детали SortedSet со списком и выполнив следующие действия в методе GetItems:
Set set = new LinkedHashSet(items); items.clear(); items.addAll(set); Collections.sort(items, itemComparator); return Collections.unmodifiableCollection(items);
с тем, что, спящий режим может работать по сбору предметов (т.е. добавление) без загрузки всей коллекции из базы данных.
@Pascal Thivent и @Jens Schauder: куча благодарностей!К сожалению, что я могу использовать только один ответ: -/
Полезные настройки Logging:
log4j.logger.org.hibernate.tool.hbm2ddl=INFO, StdoutApp
log4j.logger.org.hibernate.SQL=INFO, StdoutApp
# additionally provide the information which parameters will be bound:
log4j.logger.org.hibernate.type=TRACE
.
* (...) потому что база данных уже имела индекс из-за моей уникальной аннотации ограничения *: это очень вероятно. Вам действительно нужно проверить план запроса. –
ОК. Очень благодарю всех вас за комментарии! Теперь производительность является разумной. См. Обновленный вопрос. – Karussell