J'utilise Spring Boot et essaye d'insérer 35000 lignes en base Mysql
Voici la classe principale:
Voici le service. J'appelle cette méthode en faisant une requête via postman (cette requête a un autre but, mais j'en profite pour insérer mes lignes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 @SpringBootApplication @EnableTransactionManagement public class DemoImmobilierBackApplication implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(DemoImmobilierBackApplication.class, args); }
Voici le repository
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 @Service public class ReferenceServiceImpl implements ReferenceService { Logger logger = LoggerFactory.getLogger(ReferenceServiceImpl.class); @Autowired private ReferenceRepository referenceRepository; @Transactional public void loadDataBaseCodePostalNomCommune(Map<String,String> tokens) { List<CodePostalNomCommune> list = new ArrayList<CodePostalNomCommune>(); Iterator it = tokens.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); list.add(new CodePostalNomCommune((String)pair.getKey(), (String)pair.getValue())); } referenceRepository.persistCodePostalNomCommune(list); } }
Mais aucune ligne est insérée en base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 @Repository public interface ReferenceRepository { void persistCodePostalNomCommune(List<CodePostalNomCommune> list); } and public class ReferenceRepositoryImpl implements ReferenceRepository { Logger logger = LoggerFactory.getLogger(ReferenceRepositoryImpl.class); @PersistenceContext private EntityManager em; @Override @Transactional public void persistCodePostalNomCommune(List<CodePostalNomCommune> list) { logger.info("List<CodePostalNomCommune> SIZE="+list.size()); int i = 0; for (CodePostalNomCommune codePostalNomCommune : list) { em.persist(codePostalNomCommune); i++; if (i%20 == 0 ) { em.flush(); em.clear(); } } } }
J'ai vérifié que la méthode persistCodePostalNomCommune est bien appellée. Tout dans les logs et le temps mis par la requête indique que l'opération persist pour les 39000 ligne se déroule bien, mais quand j'inspecte la base, elle est vide.
J'ai essayé aussi de d'executer au début de la méthode em.getTransaction().begin(); et à la fin em.getTransaction().commit() soit en laissant, soit en enlevant l'annotation @Transaction , mais cela me donne l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
Partager