Bonjour,
Dans mon équipe, on est confronté a une difficulté dans des inserts massifs de données.
Quand je dis massif, c'est sur 50 000 entrées, donc rien de bien impossible pour le système(il s'en sort plutôt pas mal pour le moment)
La ou nous avons une difficulté, c'est lorsque l'on commence a douter de notre fichier en entrée et que l'on veut empêcher des insertions de données invalides.
Par exemple, sur une contrainte simple comme unique... On a un fichier de ce type :
Ce qui nous donne en plan d'execution en gros :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 1 2 3 4 5 1 6
Bien sur, lors du flush, le système plante à la seconde insertion de 1.
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 INSERT 1 persist() INSERT 2 persist() INSERT 3 persist() INSERT 4 persist() INSERT 5 persist() INSERT 1 persist() INSERT 6 persist() flush()
On a donc pensé faire ceci :
On se disait que comme dans une transaction SQL, doctrine allait regarder dans la queue d'objet à insérer quand on faisait le select... mais il semble que ca ne soit pas le cas.
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
35
36
37 SELECT 1 IF 1 NOT in DB{ INSERT 1 persist() } SELECT 2 IF 2 NOT in DB{ INSERT 2 persist() } SELECT 3 IF 3 NOT in DB{ INSERT 3 persist() } SELECT 4 IF 4 NOT in DB{ INSERT 4 persist() } SELECT 5 IF 5 NOT in DB{ INSERT 5 persist() } SELECT 1 // doctrine ne trouve pas de valeur ici. IF 1 NOT in DB{ INSERT 1 persist() } SELECT 6 IF 6 NOT in DB{ INSERT 6 persist() } flush()
Est-ce que vous avez déjà eu ce problème, et comment l'avez-vous résolu ? Notre solution actuelle consiste à faire un flush à toutes les insertions, ce qui alourdit considérablement le traitement.
Est-il possible d'utiliser un objet qui ferait correctement l'intermédiaire ?
Merci,
Pierre
Partager