使用Hibernate更新数据库表的更快方法(Java8精简?)

使用Hibernate更新数据库表的更快方法(Java8精简?),java,mysql,spring,hibernate,java-8,Java,Mysql,Spring,Hibernate,Java 8,我正在使用Hibernate作为ORM,在springboot中开发一个监视工具 我需要比较表中的每一行(已保存的已发送消息行),查看MailId(唯一)是否收到反馈(状态:打开,反弹,传递…)是或否 我通过从网络文件夹中读取csv文件获得反馈。CSV解析和读取文件的速度非常快,但数据库的更新速度非常慢。我的算法不是很有效,因为我循环遍历一个可以包含数十万个对象的列表,并在表中查找 这是通过更新“目标”对象(表数据库中的行)在我的表中进行更新的方法 @覆盖 public void updateT

我正在使用Hibernate作为ORM,在springboot中开发一个监视工具

我需要比较表中的每一行(已保存的已发送消息行),查看
MailId
(唯一)是否收到反馈(状态:
打开
反弹
传递
…)是或否

我通过从网络文件夹中读取csv文件获得反馈。CSV解析和读取文件的速度非常快,但数据库的更新速度非常慢。我的算法不是很有效,因为我循环遍历一个可以包含数十万个对象的列表,并在表中查找

这是通过更新“目标”对象(表数据库中的行)在我的表中进行更新的方法

@覆盖
public void updateTargetObjectFoo()引发CSVProcessingException,FileNotFoundException{
//在这里,我调用performProcessing方法,该方法读取文件夹中的文件并将其解析为JavaObject,然后将它们映射到Foo类型的反馈列表中
List feedBackList=performProcessing(env.getProperty(“foo_-in”)、预期的_标题_字段_状态、foo.class、“.lets.STATUS”);
对于(Foo-Foo:feedBackList){
//findByKey在mySql中执行一个简单的选择,其中MailId=foo.getMailId()
Foo persistedFoo=fooDao.findByKey(Foo.getMailId());
if(persistedFoo!=null){
persistedFoo.setStatus(foo.getStatus());
persistedFoo.setDnsCode(foo.getDnsCode());
persistedFoo.setReturnDate(foo.getReturnDate());
persistedFoo.setReturnTime(foo.getReturnTime());
//这里的save帐户对表进行MySql更新
fooDao.saveAccount(foo);
}
}
}
如果我在Java端实现了这个选择/比较和更新操作,该怎么办?然后重新更新数据库中的整个列表

会更快吗


感谢大家的帮助。

Hibernate并不特别适合批处理。 您最好使用Spring的JdbcTemplate进行jdbc批处理


但是,如果必须通过Hibernate执行此操作,这可能会有所帮助:

Hibernate并不特别适合批处理。 您最好使用Spring的JdbcTemplate进行jdbc批处理


但是,如果您必须通过Hibernate执行此操作,这可能会有所帮助:

您好,非常感谢您的回复和指导。我不限于在这个项目中使用Hibernate。我必须找到一个解决方案,使运营比现在更快。我搜索了SpringJDBCTemplate。你知道我该如何明智地实施这一点吗?通过知道我必须执行一个主操作(10-10万次):根据java对象列表更新数据库表的每一行​ 网上有很多文档和例子。这里有一个:你好,再次感谢你的回答。我正在重新开发一点我的DAO来实现JDCB模板。我将随时向您通报性能的任何变化。祝你今天愉快谢谢你的指导。使用Spring的JDBC模板将操作时间缩短了4倍!您好,非常感谢您的回复和指导。我不限于在这个项目中使用Hibernate。我必须找到一个解决方案,使运营比现在更快。我搜索了SpringJDBCTemplate。你知道我该如何明智地实施这一点吗?通过知道我必须执行一个主操作(10-10万次):根据java对象列表更新数据库表的每一行​ 网上有很多文档和例子。这里有一个:你好,再次感谢你的回答。我正在重新开发一点我的DAO来实现JDCB模板。我将随时向您通报性能的任何变化。祝你今天愉快谢谢你的指导。使用Spring的JDBC模板将操作时间缩短了4倍!到目前为止,我在实际项目中看到的“快速方法”是绕过ORM并发送SQL。事实上,我见过一些项目,其中每个数据库操作实际上都是绕过ORM完成的……到目前为止,我在实际项目中看到的“快速方法”是绕过ORM并发送SQL。事实上,我见过的项目中,每个数据库操作实际上都是绕过ORM完成的…
@Override
public void updateTargetObjectFoo() throws CSVProcessingException, FileNotFoundException {             
    // Here I make a call to performProcessing method which reads files on a folder and parse them to JavaObjects and I map them in a feedBackList of type Foo
    List<Foo> feedBackList = performProcessing(env.getProperty("foo_in"), EXPECTED_HEADER_FIELDS_STATUS, Foo.class, ".LETTERS.STATUS.");
    for (Foo foo: feedBackList) {                        
        //findByKey does a simple Select in mySql where MailId = foo.getMailId()
        Foo persistedFoo = fooDao.findByKey(foo.getMailId());
        if (persistedFoo != null) {
            persistedFoo.setStatus(foo.getStatus());
            persistedFoo.setDnsCode(foo.getDnsCode());             
            persistedFoo.setReturnDate(foo.getReturnDate());
            persistedFoo.setReturnTime(foo.getReturnTime());   
            //The save account here does an MySql UPDATE on the table
            fooDao.saveAccount(foo);
        }
    }
}