我相信我可以提高休眠以下findByName查詢的性能:什麼是最快速的findByName查詢與休眠?
public List<User> findByName(String name) {
session.createCriteria(User.class).add(Restrictions.eq("name", name)).list();
}
瓶頸是findByName方法,我不能使用id來代替。
在我的情況下,我知道該名稱是唯一的,但將名稱註釋添加到name屬性並沒有提高性能。我做了以下內容:
class User {
@Index(name = "nameIdx")
private String name;
}
在哪種方式,我應該改進它,甚至更重要的是:在這方面,我應該首先改善了嗎?我將需要這個類的所有集合(無論是否是)和全部的全部對象。
或者我可以改進它,如果我想要幾個用戶對象(並知道幾個名字)?
UPDATE1:
的@index註釋沒有提高性能,因爲數據庫已經有了一個指標,因爲我的唯一約束註釋:
@UniqueConstraint(columnNames = {"name"})
UPDATE2:
請仔細閱讀答案!
在SQL日誌的幫助下,我發現真正的問題是很多更新和插入語句被引發,儘管我沒有提交或刷新事務。 背後的原因是,我做了(在一個循環中):
User u = findByName(name); if(u == null) attach(u = new User(name));
等Hibernate需要每findByName查詢之前刷新新創建的用戶數據庫。我用我自己的緩存解決方法(LinkedHashMap)解決了這個問題。
我通過延Schauder不尖提出的另一項改進:
Read this answer得到一個:
public Collection<User> findByNames(Collection<String> names) { return session.createCriteria(User.class). add(Restrictions.in("name", names)).list(); }
進一步的改進可以指定一些用戶採集的時候不會偷懶進行更好的選擇。
最後也是最重要的一個對我來說是:用一個列表代替我的SortedSet項目,做的getItems方法如下:
Set set = new LinkedHashSet(items); items.clear(); items.addAll(set); Collections.sort(items, itemComparator); return Collections.unmodifiableCollection(items);
與,Hibernate可以在項目收集工作(即添加)而不從數據庫加載整個集合。
@Pascal Thivent和@Jens Schauder不:一堆感謝的!對不起,我只能接受一個答案: -/
有用的日誌記錄設置:
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
。
*(...)因爲數據庫已經有一個索引,因爲我唯一的約束註釋*:這很可能。你真的需要檢查查詢計劃。 – 2010-06-15 21:28:36
好的。真的非常感謝你的評論!現在表現很合理。查看更新的問題。 – Karussell 2010-06-16 07:52:02