在hibernate中优化get或create模式

时间:2012-11-24 10:54:56

标签: performance hibernate

我只保存表中的条目:

public static Email getOrCreate(Session sess, String address) {
    if (address==null) return null;
    List l = sess.createQuery("SELECT email FROM Email email WHERE email.address=:address").setString("address", address).list();
    if (l.size() > 0)
        return (Email) l.get(0);
    Email email = new Email(address);
    sess.save(email);
    return email;
}

我对这个程序的速度不满意。保存5000条复杂记录需要5分钟左右,此功能占用50%的时间。我的休眠缓存设置是:             cfg.setProperty(“hibernate.cache.provider_class”,“org.hibernate.cache.EhCacheProvider”);

当然我可以创建静态地图并有时与数据库同步,但它看起来有点难看。 hibernate可以这样做吗?感谢名单。

1 个答案:

答案 0 :(得分:1)

批量执行:

Set<String> addresses = ...;
List<String> existingAddresses = 
    session.createQuery("select email.address from Email email where email.address in :addresses")
           .setParameterList("addresses", addresses)
           .list();
addresses.removeAll(existingAddresses);
for (String address : addresses) {
    session.save(new Email(address));
}

但请确保您的数据库允许IN子句中的5000个元素。例如,Oracle将它们限制为1000.但是你仍然只能执行5个请求而不是5000个。

那就是说,5分钟的时间对我来说看起来很像。您是否在email.address上定义了数据库索引?