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

JDBC Java Discussion :

Controler le nombre d'enregistrement d'une requete avant d'envoyer les données


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 62
    Par défaut Controler le nombre d'enregistrement d'une requete avant d'envoyer les données
    Bonjour la communauté. Ma requête prend beaucoup de temps à l'exécution parce que trop de données sont envoyé.
    Je voudrais d'abords contrôler le nombre d'enregistrement. S’il dépasse un seuil ; ne rien afficher.

    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
    public List findByWhereClause(String nameClasse,String whereClause, Integer nombre){
     
    		try {
    			 Query query = entityManager.createQuery("Select object (o) From "+nameClasse+" o Where "+whereClause);
    			 List list = query.getResultList();
    			 if(list.size()<nombre){
    				return query.getResultList(); 
    			 }
    			 return null;
     
    		} catch (RuntimeException re) {
    			log.error("get failed", re);
    			throw re;
    		} 
    	}
    Cette methode prend du temps s'il y'a un grand nombre d'enregistrement. Est ce qu'il est possible de connaitre le nombre de ligne sans passer par un count(*)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Avec JDBC, tu pourrais faire ceci (je passe l'acquisition de la connexion)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery("select * from sys_config where value='OFF'");
                rs.last();
                int count = rs.getRow();
                System.out.println("Nombre de lignes : " + count);
    Bien sûr, derrière, il faudra repositionner le curseur en début (méthode first()).
    Rien ne dit que ce soit plus rapide qu'un count, il se pourrait que jdbc soit obligé de tout lire quand même, du coup, j'ai des doutes... je te laisse faire le test sur un gros volume...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 62
    Par défaut
    j'utilise une unite de persistance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @PersistenceContext(unitName="UnitEJB")
    	private EntityManager entityManager;
    Les parametres de connections sont dans un fichier xml. Serait -il possible d'utiliser la classe Connection sans mettre les parametre de connection en dur

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu as ces possibilités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Stateless
    public class MaFacade
    {
        @Resource(mappedName="java:/...")
        private DataSource dataSource;
     
        public Object getUnTruc()
        {
            Connection connection = dataSource.getConnection();
            ....
     
        }
    }
    Ou avec l'entityManager (non portable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            SessionImpl session = (SessionImpl)getEntityManager().unwrap(org.hibernate.Session.class);
            Connection connection = session.connection();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 62
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu as ces possibilités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Stateless
    public class MaFacade
    {
        @Resource(mappedName="java:/...")
        private DataSource dataSource;
     
        public Object getUnTruc()
        {
            Connection connection = dataSource.getConnection();
            ....
     
        }
    }
    J'ai essayé de faire cela. Mais j'ai des erreurs. j'ai fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Resource(mappedName="UnitEJB")
    	    private DataSource dataSource;
    @Resource(name="UnitEJB")
    	    private DataSource dataSource;
    Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Resource(mappedName="java:/UNITDS")
        private DataSource dataSource;
    jai comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: ORA-00942: Table ou vue inexistante
    voici mon fichier persistance.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <persistence-unit name="UnitEJB">
    		<provider>org.hibernate.ejb.HibernatePersistence</provider>
    		<jta-data-source>java:/UNITDS</jta-data-source>
    		<class>//les class</class>
    mon fichier oracle-ds.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <jndi-name>UNITDS</jndi-name>
    // les param de connection

  6. #6
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 62
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu as ces possibilités

    avec l'entityManager (non portable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            SessionImpl session = (SessionImpl)getEntityManager().unwrap(org.hibernate.Session.class);
            Connection connection = session.connection();
    J'ai essayé de faire ceci mais il me me demande a faire un cast donc j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SessionImpl session = (SessionImpl)((Wrapper) entityManager).unwrap(org.hibernate.Session.class);
    Connection connection = session.connection();
    Mais a l'execution il refuse ce cast

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    Par défaut
    API Query: https://docs.oracle.com/javaee/7/api...nce/Query.html
    setFirstResult, setMaxResults pour faire de la pagination

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    API Query: https://docs.oracle.com/javaee/7/api...nce/Query.html
    setFirstResult, setMaxResults pour faire de la pagination
    ben... ce n'est pas ce qu'il demande...

    Même pour la pagination, dans un dataTable de Primefaces par exemple, il faut connaître le nombre total d'enregistrements que peut renvoyer la requête, sinon, l'option paginator ne peut pas fonctionner
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 256
    Par défaut
    Je ne sais pas si tous les SGBD supporte cela, PostgreSQL oui.

    Mais en ajoutant ceci au query vous pouvez récupérer le nombre de lignes retournées par celui-ci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT COUNT(nom_de_la_table.clé) OVER() AS nb_total_lignes

    Il suffira de lire nb_total_lignes (contenu dans toutes les lignes) de la première ligne avant de lire les autres lignes.

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    Par défaut
    Citation Envoyé par genamiga Voir le message
    Je ne sais pas si tous les SGBD supporte cela, PostgreSQL oui.

    Mais en ajoutant ceci au query vous pouvez récupérer le nombre de lignes retournées par celui-ci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT COUNT(nom_de_la_table.clé) OVER() AS nb_total_lignes

    Il suffira de lire nb_total_lignes (contenu dans toutes les lignes) de la première ligne avant de lire les autres lignes.
    "suffit" aussi de tester les perfs avant de s'engager dans une telle direction :

    Petit test rapide ici sur une table pas trop petite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(pk) from big_table ;
    4342218
    renvoie le résultat en 0.282 secs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from big_table ;
    renvoie les 50 premières rows en 0.282 secs aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(pk) over () as n, o.* from big_table o ;
    met 30 secs pour renvoyer les 50 premières rows... soit 2 ordres de grandeur plus lent...

    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select c.n, o.* from big_table o,
        (select count(primary_key) as n  from big_table) c
    met aussi 0.282 secs pour retourner les 50 premières rows.
    (une "where" clause devra être dupliquée dans les 2 "select" évidemment)

  11. #11
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 256
    Par défaut
    Très bonne remarque...

    Dans ce cas il vaut mieux le faire en 2 requêtes.

    Une pour connaitre le nombre des lignes (très rapide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(nom_de_la_table.clé) OVER() AS nb_total_lignes FROM table LIMIT 1
    et une pour récupérer les données SANS le nombre de lignes.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/10/2008, 19h46
  2. Nombres D'enregistrements d'une requete
    Par Fluxy dans le forum ASP
    Réponses: 3
    Dernier message: 02/08/2007, 16h54
  3. nombre d'enregistrement d'une requete
    Par karimspace dans le forum Oracle
    Réponses: 3
    Dernier message: 29/03/2006, 17h40
  4. Nombre d'enregistrements d'une requete source
    Par kleenex dans le forum Access
    Réponses: 3
    Dernier message: 10/01/2006, 12h13
  5. Réponses: 2
    Dernier message: 13/03/2005, 15h10

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