0

仅当条目已经存在时,我才将条目保存在表中:

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");

当然我有时可以创建静态地图并将其与数据库同步,但它看起来有点难看。休眠可以做这样的事情吗?谢谢。

4

1 回答 1

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 上定义了数据库索引?

于 2012-11-24T11:39:20.900 回答