IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

application très lente


Sujet :

Java

  1. #1
    Membre du Club Avatar de hamham
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 47
    Points
    47
    Par défaut application très lente
    Bonjour à tous

    je fais actuellement une application en java, reliée à une base de données.
    L'utilisateur passe par des interfaces graphiques.

    A un certains moment, l'application se bloque et met beaucoup de temps à répondre. A cet endroit, le programme doit faire quelques requêtes SQL.
    Pensez vous que ce sont ces requêtes qui ralentissent autant l'application ou le problème peut il venir d'ailleurs.

    Merci
    Bye
    HamHam!!!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    essaye de faire un system.out.println() a la place de la requete.
    Si c'est plus court, est ce que ta requete s'effectue apres un long temps d'execution ou elle plante?
    Si elle plante essaye de l'executer dans ton gestionnaire de base

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Avec si peu de détail ce n'est pas évident, mais je parierais sur un blocage de l'EDT (lire Threads et performance avec Swing par gfx)...

    • Quel type d'UI tu utilises ? Swing ? AWT ? SWT ?
    • A quel moment le programme se bloque-t-il ? Toujours dans les mêmes fonctionnalité ou de manière aléatoire ? Si c'est toujours au même endroit il serait utile de poster un peu de code...


    a++

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    dure de te répondre avec si peux de détail.

    Tes requetes sont longues à exécuter sur la bdd (sans passer par jdbc) ?

    est ce que ton programme attend les resultats pour continuer ou alors c'est dans des threads à part ?

    Cette base est accédée par plein de monde en meme temps ?

    La base est locale, sur un réseau local, sur le net ?

    Enfin bref ... ça peut dépendre de plusieurs paramètres.

    Si ce sont les requetes qui sont longues essaie de les optimiser (suivant la bdd que tu utilise).

    Au fait c'est quel genre de requete ? insert, update, select ?
    Parce que n'oublies pas que tu peux appeler des procédures stockées sur la base de donnée. Tu peux aussi utiliser des traitements par lot (batch) mixés avec des preparedStatement ...
    Précise un peu ce point : c'est quoi tes requetes ? Comment tu les execute ?

    Sinon, solution de substitution, si il y a des ralentissement essaie de mettre une barre de progression ou un truc du genre pour que l'utilisateur sache que ça travaille et ai moins l'impression que c'est bloqué ... C'est toujours mieux
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Avec si peu de détail ce n'est pas évident, mais je parierais sur un blocage de l'EDT (lire Threads et performance avec Swing par gfx)...

    • Quel type d'UI tu utilises ? Swing ? AWT ? SWT ?
    • A quel moment le programme se bloque-t-il ? Toujours dans les mêmes fonctionnalité ou de manière aléatoire ? Si c'est toujours au même endroit il serait utile de poster un peu de code...


    a++
    Je pense aussi que ça doit être ça vu la "petite" description du problème...

  6. #6
    Membre du Club Avatar de hamham
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Deja merci a tous de m'avoir répondu.

    Je vais essayer de répondre à toutes vos questions, mais je ne pense pas pouvoir mettre le code de cette page en entier il serait trop long.

    Tout d'abords, j'ai encore un peu de mal à faire la différence entre AWT et SWING, mais je ne pense pas que le problème vienne de la. Je pense que ça vient de cette requête :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
        		Statement st=conn.createStatement();
     
        		String query1 = "SELECT Count(*) as nbr FROM film";
    		ResultSet rs1 = st.executeQuery(query1);
    	   		while (rs1.next())
    	   			{film = new String[rs1.getInt("nbr")];}
        		int i = 0;
     
     
        		String query= "SELECT DISTINCT Titre FROM film F, joue J, acteur Ac, appartient Ap, categorie C," +
        				"realisateur Re, realise R";
        		if (paramfilm!=null)
        		{
        			query+= " WHERE (Titre LIKE '% "+paramfilm+" %' OR Titre LIKE '"+paramfilm+" %' OR Titre LIKE '% "+paramfilm+"' AND Titre REGEXP '[[:<:]]tout[[:>:]]') ";
            		i = 1;
        		}
        		if (paramact!=null)
        			{if (i==1){query+=" and";} else {query+=" WHERE";}
        			query+= " CONCAT(PreAct,' ',NomAct) LIKE '"+paramact+"' and Ac.IdAct= J.IdAct and J.IdFilm = F.IdFilm";
        			i = 1;}
        		if (paramreal!=null)
        		{
        			if (i==1){query+=" and";} else {query+=" WHERE";}
        			query+=" CONCAT(PreReal,' ',NomReal) LIKE '"+paramreal+"' and Re.IdReal=R.IdReal and R.IdFilm=F.IdFilm";
        			i=1;
        		}
        		if(paramcat!=null)
        		{
        			if (i==1){query+=" and";} else {query+=" WHERE";}
        			query+=" LibelCat LIKE '"+paramcat+"' and C.IdCat=Ap.IdCat and Ap.IdFilm=F.IdFilm";
        		}
        		query+=" ORDER BY Titre;";
     
        		i=0;
        	        ResultSet rs = st.executeQuery(query);
     
        	        i=0;
        	        while(rs.next())
        	        {
        	        	film[i]=rs.getString("Titre");
        	        	System.out.println (film[i]);
        	        	i++;
        	        }
        	        st.close();
        	}
        	catch (SQLException e){
        		System.out.println("Gloups "+e);
        	}
     
     
     
        	tFilm= new JList(film);
        	tFilm.setVisibleRowCount(8);
        	conteneur.add(new JScrollPane(tFilm));
    Les paramflm, paramact.. sont des String qui viennent d'un autre formulaire.

    pour information, ma base est en local, et le programme attend tFilm pour afficher la page. J'ai essayer avec un preparedStatement, mais je n'y suis pas arrivée.

    je vous remercie
    HamHam!!!

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Quelques remarques :

    • As-tu testé les requêtes via les outils de ta BD pour voir le temps que cela prend ?
    • Tu ne fermes pas le premier ResultSet (pas bien !). De plus il faudrait le faire dans un bloc finally...
    • Si la requête SQL prend un certain temps et qu'elle est appelé dans une des méthodes évènementielle (comme actionPerformed() par exemple), alors elle est exécuté dans l'EDT et cela bloquera l'interface graphique...



    a++

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Si je peux me permettre, pourquoi tu fais :
    ...Titre like '%mot%' or Titre like '%mot' or Titre like 'mot%'... ?
    le premier like te les renvois tous...
    Ce que tu demandes (traduit en français), c'est : donne moi tout ce qui contient 'mot' ou tout ce qui termine par 'mot' ou tout ce qui commence par 'mot'
    Ensuit, les paramact, paramreal et paramcat contiennent les '%' ? Parce que sinon, mieux vaut mettre '=' que 'like'...
    A part ça, tu peux mettre des points d'arrêt dans ton traitement et voir où ça coince...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Cette requete ne peut pas marcher rapidement dans la plupart des cas. Tu écris le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        		String query= "SELECT DISTINCT Titre FROM film F, joue J, acteur Ac, appartient Ap, categorie C," +
        				"realisateur Re, realise R";
    Donc, quels que soient les paramètres passés, tu vas réaliser des jointures sur 7 tables. Or, tu ne fais que des jointures partielles suivant les paramètres passés.
    Tu auras donc des produits cartésiens sur potentiellement 7 tables ! Derrière, tu fais un distinct qui peut être potentiellement couteux.
    Ce que je te conseille, c'est de rajouter les jointures entre les 7 tables SYSTEMATIQUEMENT à la fin ou au début de ta requête. Les perfs devraient augmenter drastiquement !
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xv-mnt
    Donc, quels que soient les paramètres passés, tu vas réaliser des jointures sur 7 tables. Or, tu ne fais que des jointures partielles suivant les paramètres passés.
    Tu auras donc des produits cartésiens sur potentiellement 7 tables ! Derrière, tu fais un distinct qui peut être potentiellement couteux.
    C'est certain... ça m'avait fait tiquer aussi, mais je n'avais pas percuté...
    Pour rajouter une couche, en fonction des bases de données, tu peux augmenter les performances en utilisant des 'join' ou 'left join' plutôt que ce genre de jointure

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club Avatar de hamham
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    déja merci à tous,

    j'ai finalement opté pour le code suivant, donnez moi votre avis :

    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
    43
    44
    int i =0;
    String querysuite="";
        		String query= "SELECT DISTINCT Titre" +
        				" FROM film F";
        		if (paramfilm!=null)
        		{
        			querysuite+= " WHERE (Titre LIKE '% "+paramfilm+" %' OR Titre LIKE '"+paramfilm+" %' OR Titre LIKE '% "+paramfilm+"' AND Titre REGEXP '[[:<:]]tout[[:>:]]') ";
        			i=1;
        		}	
        		if (paramact!=null)
        		{	
        			if (i==0)querysuite+=" WHERE"; else querysuite+=" AND";
        			query+=", acteur Ac, joue J";
        			querysuite+= " CONCAT(PreAct,' ',NomAct) LIKE '"+paramact+"' AND Ac.IdAct=J.IdAct" +
        				" AND J.IdFilm=F.IdFilm";
        		}
        		if (paramreal!=null)
        		{	
        			if (i==0)querysuite+=" WHERE"; else querysuite+=" AND";
        			query+=", realisateur Re, realise R";
        			querysuite+=" CONCAT(PreReal,' ',NomReal) LIKE '"+paramreal+"' AND Re.IdReal=R.IdReal " +
        				" AND R.IdFilm=F.IdFilm";
        		}
        		if(paramcat!=null)
        		{	
        			if (i==0)querysuite+=" WHERE"; else querysuite+=" AND";
        			query+=", appartient Ap, categorie C"; 
        			querysuite+=" LibelCat LIKE '"+paramcat+"'AND C.IdCat=Ap.IdCat " +
        				" AND Ap.IdFilm=F.IdFilm";
        		}
        		query+=querysuite+" ORDER BY Titre;";
     
        		i=0;
        	        ResultSet rs = st.executeQuery(query);
     
        	        i=0;
        	        while(rs.next())
        	        {
        	        	film[i]=rs.getString("Titre");
        	        	System.out.println (film[i]);
        	        	i++;
        	        }
        	        st.close();
        	        rs.close();
    de plus, comme je dois beaucoup travailler sur java, si quelqu'un si connait vraiment et qu'il veut bien répondre à mes questions, qu'il m'envoie un message privé. Merci

    Bye
    HamHam!!!

  12. #12
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Ce que tu peux faire, c'est que partout où tu le jugeras nécessaire tu faits un System.out.println( un chiffre ) en partant de 1 à X et tu vois entre quels chiffres c'est le plus long... Une fois que t'as trouvé une zone qui est lente, tu refais pareil au sein de cette même zone, etc. En gros, tu resserres l'étau sur la ou les lignes qui ralentissent !

  13. #13
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    a priori ça devrait être mieux puisque tu n'utilise que les tables nécessaires à chaque fois. A tester chez toi pour les perfs.

    Remarque : Pour la lisibilité, tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (i==0)querysuite+=" WHERE"; else querysuite+=" AND";
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    querysuite+= (i==0) ? " WHERE" : " AND";
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  14. #14
    Membre du Club Avatar de hamham
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    merci pour tous vos conseils et a très vite
    bye
    HamHam!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] application très lente?
    Par hamza_azerty dans le forum C#
    Réponses: 14
    Dernier message: 16/10/2014, 11h48
  2. application trés lente en php
    Par abdego dans le forum Langage
    Réponses: 10
    Dernier message: 16/05/2014, 11h35
  3. Application très lente au démarrage
    Par anissbenben dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/11/2012, 19h22
  4. Application très lente sous solaris
    Par pchoucine dans le forum Débuter avec Java
    Réponses: 18
    Dernier message: 01/10/2009, 15h50
  5. Application vb6 très lente
    Par guandal dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 06/02/2008, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo