java - 在两个表的条件下在休眠中批量插入
问题描述
我想在数据库或其他表中不存在的情况下在数据库中插入 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;
}
有没有办法通过一次事务插入所有内容?我可以想象打开和关闭的部分是蓝领。
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;
}
但是速度并没有增加。所以缓慢的部分仍然是存在检查。
解决方案
推荐阅读
- ruby-on-rails - 向表单添加预填充复选框/单选按钮时避免重复代码
- matlab - 如何找到执行 matlab 脚本所需的工具箱(未安装)?
- swift - 在 Swift 中使用继承自动编码和解码
- firebase - Firebase / VueFire 规则通过验证器但不返回任何结果
- python - 是否可以通过 python 中的 pandas 或 Sql Queries 之类的东西编写 sql 查询?
- android - 不要在材料组件芯片Android上显示选中的图标
- c# - Xamarin 前台服务通知不会更改其文本
- scala - 如何将火花流输出包装在数组括号中?
- batch-file - 这个 for /r 循环以意想不到的方式工作
- java-native-interface - Mahout 0.13.0 spark-shell 示例因“java.library.path 中没有 jniViennaCL”而失败