java在hibernate中的大容量插入

hrysbysz  于 2021-07-29  发布在  Java
关注(0)|答案(0)|浏览(201)

我想在一个数据库中插入一个url列表,条件是它不存在于一个表或其他表中。
我目前的尝试非常缓慢,每个请求可能需要100毫秒到500毫秒。

for(URL url : urls) {
 if (this.urlToEditService.findByUrl(newUrl).size() == 0 &&
     this.rawPageService.findByUrl(newUrl).size() == 0) {

      UrlToEdit urlToEdit = new UrlToEdit(newUrl);
      urlToEditService.save(urlToEdit);
 }
}

这是我的保存方法。

public boolean save(UrlToEdit urlToEdit) {
        Transaction transaction = null;
        try (Session session = factory.openSession()) {
            transaction = session.beginTransaction();
            session.save(urlToEdit);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
            return false;
        }

        return true;
}

有没有办法用一个事务插入所有事务?我可以想象,打开和关闭的部分是boodleneck。
edit1:我对代码做了一点更改,以便根据以下答案保存在一个事务中:

List<URLToEdit> list = new ArrayList();
for(URL url : urls) {
 if (this.urlToEditService.findByUrl(newUrl).size() == 0 &&
     this.rawPageService.findByUrl(newUrl).size() == 0) {

      list.add( new UrlToEdit(newUrl));
 }
}
public boolean save(List<URLToEdit> urlToEditList) {
        Transaction transaction = null;

        int counter = 0;

        try (Session session = factory.openSession()) {
            transaction = session.beginTransaction();
            for (UrlToEdit urlToEdit : urlToEditList) {
                     session.save(urlToEdit);
                     counter++;

                     if(counter > 20) { 
                         counter = 0;
                         session.flush();
                         session.clear();
                     }
            }
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
            return false;
        }

        return true;
}

但是速度没有增加。所以慢的部分仍然是存在的检查。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题