Java 在两个表以上的条件下在hibernate中大容量插入
我想在数据库或其他表中不存在URL的情况下,在数据库中插入URL列表。Java 在两个表以上的条件下在hibernate中大容量插入,java,sql,hibernate,mariadb,Java,Sql,Hibernate,Mariadb,我想在数据库或其他表中不存在URL的情况下,在数据库中插入URL列表。 我目前的尝试非常缓慢,每个请求可能需要100毫秒-500毫秒 for(URL url : urls) { if (this.urlToEditService.findByUrl(newUrl).size() == 0 && this.rawPageService.findByUrl(newUrl).size() == 0) { UrlToEdit urlToEdit = new Ur
我目前的尝试非常缓慢,每个请求可能需要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 List=new ArrayList();
用于(URL:URL){
if(this.urlToEditService.findByUrl(newUrl).size()==0&&
this.rawPageService.findByUrl(newUrl).size()=0){
添加(新URL编辑(新URL));
}
}
public boolean保存(列表urlToEditList){
事务=空;
int计数器=0;
try(Session Session=factory.openSession()){
事务=session.beginTransaction();
用于(UrlToEdit UrlToEdit:urlToEditList){
session.save(urlToEdit);
计数器++;
如果(计数器>20){
计数器=0;
session.flush();
session.clear();
}
}
commit();
}捕获(例外e){
if(事务!=null){
transaction.rollback();
}
e、 printStackTrace();
返回false;
}
返回true;
}
但是速度没有增加。所以慢的部分仍然是存在的检查
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;
}