Salut à tous,

J'ai un problème de BDD à traiter sur de gros volumes de données...

En gros, en entrée j'ai un fichier que sur lequel j'effectue un traitement, pour stocker en bases les éléments. Il peut y avoir de 0 à n lignes, voici 2 traces d'exécutions pour un fichier de 1,10 Mo :

Trace 1
Nombre de lignes traitées : 19427
[DEBUG] Fin de lecture, durée=437

Trace 2
Nombre de lignes traitées : 19427
[DEBUG] Fin de lecture, durée=13968
La trace 1 traite tout le fichier mais la ligne m_statementPreCreateDataLine.executeUpdate(); est mise en commentaire...

La seconde effectue la sauvegarde en base... Imaginez ma stupeur lorsque j'ai essayé sur un fichier de 80 Mo pour le temps de traitement interminable...

J'ai une classe qui crée un thread l'initilise et joue avec les méthodes start stop et save trame (cf. source ci dessous pour celle ci)

source abbrégé :

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
38
39
40
41
42
class ThreadSaveData extends Thread implements Constantes
{
	private static PreparedStatement m_statementPreCreateDataLine ; // prépare le format de la ligne de données
 
	public ThreadSaveData(Connection p_bddConnexion,String p_strNomTableData)
	{
		try {
			m_statementPreCreateDataLine = p_bddConnexion.prepareStatement("INSERT INTO "+p_strNomTableData+" VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
		} catch (SQLException e) {
			System.err.println("erreur de préparation du statement dans le thread");
			e.printStackTrace();
		}
	}
 
	public void saveTrame(int p_iType, ArrayList p_tEltTable)
	{
		try {
 
			m_statementPreCreateDataLine.setString(g_bddTableData.m_iColTemps, (String)p_tEltTable.get(0));
 
			// ... etcc ...
 
			String data = "" ;
			Integer val = new Integer((String)p_tEltTable.get(5));
 
 
			for (int cpt=0 ; cpt < val  ; cpt++)
			{
				data += (String)p_tEltTable.get(6+cpt) ;
				if (cpt!=(val-1)) data += ".";
			}	
 
			m_statementPreCreateDataLine.setString(g_bddTableData.m_iColData, data);
 
			m_statementPreCreateDataLine.executeUpdate();
 
		} catch (SQLException e) {
			System.err.println("erreur remplissage de statement");
			e.printStackTrace();
		}
	}
}

Y a t il un moyen de résoudre cette lenteur ?? Merci d'avance pour votre aide