嗨,我有一个应用程序,其中当请求带有一个数组时,我必须从表中选择数据,如果找不到,则生成新值并插入到表中,然后再次循环统计检查下一个值等等。对于新请求,此操作将执行大约 50000 次。
我正在使用
public void save(Object obj,Session session) {
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
//session.saveOrUpdate(obj);
//session.flush();
session.clear();
tx.commit();
}
catch (HibernateException e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
if(tx!=null){
tx.rollback();
}
}
}
提交方法,并为每个生成的新值调用它。就像每个请求它被调用 50000 次一样。 我必须为每个值提交事务,因为我不希望在表中生成重复的值,因此如果新请求带有相同的数据并且前一个请求正在运行,则应从表中获取该值。所以我想我必须提交每个事务..但是如果我使用经典的 JDBC 而不是 hibernate ,这会变得相当快,所以呢?我做错了什么吗,与它相比, hibernate 速度很慢吗?因为我认为大部分时间都消耗在一次又一次开始和提交事务上。
最佳答案
您正在做的是批处理。
一些想法
- 使事务规模更大(跨度超过 1 个插入)
- 使用乐观锁定:如果发生冲突则重试
- 配置 JDBC 批量大小
为了避免重复插入,请添加一个额外的列来保存自然键并具有唯一约束。
关于java - 每个事务后 Hibernate 提交会导致速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794788/