我只保存表中的条目:
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可以这样做吗?感谢名单。
答案 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上定义了数据库索引?