hibernate加速插入

0pizxfdo  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(355)

插入到数据库要花很多时间,如何加快整个过程?在这个项目中,我使用的是hibernate

for (int a = 0; a < persons.size(); a++) {    
    Person person = new Person();

    Gender gender = new Gender();
    gender.setName(persons.get(a).getGender());
    gender = genderRepository.save(gender);

    Country country = new Country();
    country.setName(persons.get(a).getCountry());
    country = countryRepository.save(country);

    person.setName(personss.get(a).getFirstName());
    person.setLastName(persons.get(a).getLastName());
    person.setAdditionalInfo(persons.get(a).getIdentifier());
    person.setGender(gender);

    Set<Country> countries = new HashSet();
    countries.add(country);
    person.setCountries(countries);

    personRepository.save(person);
}
tzcvj98z

tzcvj98z1#

您需要在一个hibernate事务中执行所有insert操作。在person存储库中创建addpersonlist方法

@Autowired
private EntityManager em;

@Transactional
public void addPersonList(){
    for (Person personFromList : persons) {    
        Person person = new Person();

        Gender gender = new Gender();
        gender.setName(personFromList.getGender());
        em.persist(gender);

        Country country = new Country();
        country.setName(personFromList.getCountry());
        em.persist(country);

        person.setName(personFromList.getFirstName());
        person.setLastName(personFromList.getLastName());
        person.setAdditionalInfo(personFromList.getIdentifier());
        person.setGender(gender);

        Set<Country> countries = new HashSet();
        countries.add(country);
        person.setCountries(countries);

        em.persist(person);
    }
}

现在,所有操作都在一个persistcontext中,hibernate可以优化数据库中的插入和提交。
升级版本:
如果尚未更改事务传播级别(默认传播级别为propagation.required),则可以在addpersonlist方法中使用其他repositories@transactional方法-这不会影响速度,因为hibernate不会为它们创建新事务。所以,这个代码也可以:

Gender gender = new Gender();
        gender.setName(personFromList.getGender());
        gender = genderRepository.save(gender);
cs7cruho

cs7cruho2#

意见:
不要在“for”语句中添加新的person对象
不在“for”语句中启动新事务
原因:
在“for”语句中,新对象将导致资源浪费
sql尝试放在一个段落中,减少对数据库的操作

相关问题