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

Hibernate Java Discussion :

commnet veriffier que le cache est bien mis en place


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut commnet veriffier que le cache est bien mis en place
    salut,

    j ai configuré ehcache dans mon application , je fais une servelet au demarage de mon appli (Spring+hibernate) lit tous les objet d'une table par loadallBo, pour vérifier si le cache est en place je detruit la table de la bd et je rappel la méthode loadallBo () est la jé une erreur comme quoi la table n existe pas;
    157 - com.anam.amid.general.exception.DatabaseFailureException: Exception de type dataAccessException au niveau de la méthode loadAllBo Hibernate operation: could not execute query; bad SQL grammar [select this_.ACTION_ID as ACTION1_26_0_, this_.ACTION_LIB as ACTION2_26_0_, this_.ACTION_ROLE as ACTION3_26_0_ from ACTION this_]; nested exception is java.sql.SQLException: ORA-00942: Table ou vue inexistante


    est ce que vous voyez le prb? j ai mis ma conf comme dans le projet TUDU ehcache.xml+ <cache usage="read-write" /> dans le mapping de la table + declaration du cache au nivau du fichier applicationContext.xml
    voila mon fichier application context
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>
     
    <!-- ======================== DEFINITIONS PERSISTANCE ======================== -->
     
    <!-- - - - - - - - - - - - -      Source de donnée    - - - - - - - - - - - -  -->
    <!--  Base de donnée cible : Mysql                                             -->
    <!--  AUthentification     : User + Password                                   -->
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
    <bean id="dataSourceSTK"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName">
        <value>oracle.jdbc.driver.OracleDriver</value>
      </property>
      <property name="url">
        <value>jdbc:oracle:thin:@10.156.20.55:1521:orcl</value>
      </property>
      <property name="username"><value>amid</value></property>
      <property name="password"><value>amid</value></property>
    </bean>
     
    <!-- - - - - - - - - - - - -      Session Factory     - - - - - - - - - - - -  -->
    <!--  Gère les accès aux données via Hibernate                                 -->
    <!--  Permet la création d'une base V0 : property hibernate.hbm2ddl.auto       -->
    <!--  Liste les tous les fichiers de mapping hbm.xml de l'application          -->
    <!--  Bindée à la source de donnée                                             -->
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
    <bean id="sessionFactorySTK"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
      <property name="hibernateProperties">
        <props>
          <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
          <prop key="hibernate.show_sql">true</prop>
          <!-- prop key="hibernate.hbm2ddl.auto">create</prop-->
          <!-- prop key="hibernate.cglib.use_reflection_optimizer">true</prop-->
          <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
          <prop key="hibernate.cache.use_second_level_cache">true</prop>
          <prop key="hibernate.cache.use_query_cache">true</prop>
          <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
         </props>
      </property>
      <property name="dataSource">
        <ref bean="dataSourceSTK"/>
      </property>
     
       <property name="mappingResources">
        <list>  
        	<value>com/anam/amid/bo/Action.hbm.xml</value>
        	<value>com/anam/amid/bo/Droits.hbm.xml</value>
        	<value>com/anam/amid/bo/Profil.hbm.xml</value>
        	<value>com/anam/amid/bo/Utilisateur.hbm.xml</value>
        	<value>com/anam/amid/bo/Ald.hbm.xml</value>
        	<value>com/anam/amid/bo/Cim10.hbm.xml</value>
        	<value>com/anam/amid/bo/ClasseAld.hbm.xml</value>
        	<value>com/anam/amid/bo/ClasseTerapeutique.hbm.xml</value>
        	<value>com/anam/amid/bo/Composition.hbm.xml</value>
        	<value>com/anam/amid/bo/Dci.hbm.xml</value>
        	<value>com/anam/amid/bo/Medicament.hbm.xml</value>
        	<value>com/anam/amid/bo/MedicamentAld.hbm.xml</value>
        	<value>com/anam/amid/bo/Prix.hbm.xml</value>
     
        </list>
      </property>
    </bean>
     
    <!-- - - - - - - - - - -     Gestionnaire de transactions    - - - - - - - - - -->
    <!--  Gestionnaire des transactions pour une session hibernate unique          -->
    <!--  Alternative à JTA (Java Transaction API) pour la gestion des transactions-->
    <!--  Bindée à la session factory                                              -->
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
    	<bean id="transactionManagerSTK" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory">
    			<ref local="sessionFactorySTK" />
    		</property>
    	</bean> 
     
    <!-- ======================== DEFINITIONS DES SERVICES ======================= -->
     
    <!-- - - - - - - - - - - - -    Données de référence    - - - - - - - - - - - -->
    <!--  Contient tous les services génériques SaveBo,SaveListBo, UpdateBo ...    -->
    <!--  Par défaut ce service est accessible à partir de toutes les actions et   -->
    <!--  de toutes les autres couches de service                                  -->
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
     
    <!-- SERVICE DES DONNEES DE REFERENCE -->
    	<bean id="referenceDataService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">	
    		<property name="transactionManager"><ref local="transactionManagerSTK"/></property>
    		<property name="target"><ref local="referenceDataTarget"/></property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="get*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>				
                    <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>   
                    <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>   
                    <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>   
       			</props>
    		</property>
    	</bean>
     
    <!-- Classe d'implémentation du service des données de reference -->
    <!-- Possède une relation avec la couche DAO dudit service  -->
    	<bean id="referenceDataTarget" class="com.anam.amid.referentiel.service.spring.ReferenceDataServiceSpringImpl">
    		<property name="referenceDataDAO"><ref local="referenceDataDAO"/></property>
    	</bean>
     
    <!-- Couche DAO du service des données de reference -->
    <!-- Possède une relation avec l'implementation hibernate de l'application : sessionFactorySTK  -->
    	<bean id="referenceDataDAO" class="com.anam.amid.referentiel.service.dao.hibernate.ReferenceDataHibernateDAO">
    		<property name="sessionFactory"><ref local="sessionFactorySTK"/></property>
    	</bean>
     
    <!-- - - - - - - - - - - - -    Module Administration    - - - - - - - - - - - -->
    <!--  Contient tous les services spécifiques au module administration          -->
    <!--  Dans le cadre d'une conception cohérente, ne doit pas contenir de        -->
    <!--  services de type générique car il a accès aux services de référence      -->
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
     
    <!-- SERVICE DU MODULE ADMINISTRATION -->
    	<bean id="administrationDataService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">	
    		<property name="transactionManager"><ref local="transactionManagerSTK"/></property>
    		<property name="target"><ref local="administrationDataTarget"/></property>
    		<property name="transactionAttributes">
    			<props>
                    <prop key="deleteListUtilisateurs">
                       PROPAGATION_REQUIRED,
                       -com.archos.conseil.softwork.exception.livraison.OrdreChargementPKException
                    </prop>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
    			</props>
    		</property>
    	</bean>
     
    <!-- Classe d'implémentation du service du module administration -->
    <!-- Possède une relation avec la couche DAO dudit service  -->
    <!-- administrationTarget primary business object implementation -->
    	<bean id="administrationDataTarget" class="com.anam.amid.administration.service.spring.AdministrationDataServiceSpringImpl">
    		<property name="administrationDataDAO"><ref local="administrationDataDAO"/></property>		
    		<property name="referenceDataService"><ref local="referenceDataService"/></property>
    	</bean>
     
    <!-- Couche DAO du service du module administration -->
    <!-- Possède une relation avec l'implementation hibernate de l'application : sessionFactorySTK  -->
    	<bean id="administrationDataDAO" class="com.anam.amid.administration.service.dao.hibernate.AdministrationDataHibernateDAO">
    		<property name="sessionFactory"><ref local="sessionFactorySTK"/></property>
    	</bean>
     
    </beans>
    y a il un truc qui manque

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Le cache stocke les entités selon leur clé primaire, mais la plupart du temps ne les contient pas toutes. Donc si tu demande toutes les entités, il ne faut pas qu'il te renvoie le contenu du cache, il faut qu'il fasse un requête.

    Si tu veux cacher le résultat de ta requête il faut appeler setCacheable(true) sur l'objet Query (ou Criteria). Dans ce cas Hibernate cachera les ids des objets retournés. La prochaine fois que la requête sera exécutée, Hibernate prendra ces ids et chargera les objets correspondants, soit depuis le cache (s'ils y sont), soit en faisant une requête par objet

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut
    je vous éxplique ce que j ai fais:
    1) j ai fais mon pojo Action
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    /** 
    *  
    *  
    * @hibernate.class table="ACTION" 
    * @hibernate.cache usage="read-write" 
    * @author  
    */ 
     
    public class Action { 
     
    /** 
    * Clé primaire de l'objet 
    */ 
    private Integer idAction; 
     
    /** 
    * Libelle de l'action 
    */ 
    private String libelle; 
     
    /** 
    * Code du role 
    */ 
    private String role; 
     
     
    /** 
    * Constructeur par défaut 
    */ 
    public Action() { 
    super(); 
    } 
     
    /** 
    * Constructeur prenant en argument la clé primaire 
    */ 
    public Action(Integer action) { 
    super(); 
    idAction = action; 
    } 
     
    /** 
    * @hibernate.id generator-class="native" type="int" column="ACTION_ID" unsaved-value="null" 
    * @return Integer 
    */ 
    public Integer getIdAction() { 
    return idAction; 
    } 
     
    /** 
    * @param id 
    */ 
    public void setIdAction(Integer idAction) { 
    this.idAction = idAction; 
    } 
     
     
    /** 
    * @hibernate.property column="ACTION_LIB" type="string" length="50" not-null="true" unique="false" 
    *  
    * @return string 
    */ 
    public String getLibelle() { 
    return libelle; 
    } 
     
    /** 
    * @param libelle 
    */ 
    public void setLibelle(String libelle) { 
    this.libelle = libelle; 
    } 
     
    /** 
    * @hibernate.property column="ACTION_ROLE" type="string" length="50" not-null="true" unique="true" 
    *  
    * @return string 
    */ 
    public String getRole() { 
    return role; 
    } 
     
    /** 
    * @param role 
    */ 
    public void setRole(String role) { 
    this.role = role; 
    } 
     
     
     
    }
    2)j ai ecris le fichier hbm.xml
    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
    56
    57
    58
    59
    60
    <?xml version="1.0" encoding="UTF-8"?> 
     
    <!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
     
    <hibernate-mapping 
    > 
    <class 
    name="com.anam.amid.bo.Action" 
    table="ACTION" 
    > 
    <cache usage="read-write" /> 
     
    <id 
    name="idAction" 
    column="ACTION_ID" 
    type="int" 
    unsaved-value="null" 
    > 
    <generator class="native"> 
    <!--  
    To add non XDoclet generator parameters, create a file named  
    hibernate-generator-params-Action.xml  
    containing the additional parameters and place it in your merge dir.  
    -->  
    </generator> 
    </id> 
     
    <property 
    name="libelle" 
    type="string" 
    update="true" 
    insert="true" 
    column="ACTION_LIB" 
    length="50" 
    not-null="true" 
    unique="false" 
    /> 
     
    <property 
    name="role" 
    type="string" 
    update="true" 
    insert="true" 
    column="ACTION_ROLE" 
    length="50" 
    not-null="true" 
    unique="true" 
    /> 
     
    <!-- 
    To add non XDoclet property mappings, create a file named 
    hibernate-properties-Action.xml 
    containing the additional properties and place it in your merge dir. 
    --> 
     
    </class> 
     
    </hibernate-mapping>

    3) Au démarage de l application je f ais un premier appel à un service:
    getReferenceDataService().loadAllBo(Action.class);

    qui retourne tous les objets de cette table;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public List loadAllBo(Class className) throws DatabaseFailureException { 
     
    try 
    {  
    List allBo=getHibernateTemplate().loadAll(className); 
    return allBo ; 
    } 
    catch (DataAccessException e) 
    { 
    throw new DatabaseFailureException("Exception de type dataAccessException au niveau de la méthode loadAllBo "+e.getMessage()); 
    } 
     
    }
    4) Pour verifier si le cache marche bien
    a) je modifier un champs en BD est je rappel cette methde je remarque que mon service detecte la modiff
    b) je supprime la table est je rappel le service et là j ai l erreur precedente.

    cela veut dir que mes objets ne sont pas en cache.
    est ce que les tests ne sont pas bon? si oui, comment testé que le cache marche bien?

    mon fichier ehcache.xml
    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
    <ehcache> 
     
    <diskStore path="java.io.tmpdir"/> 
     
    <!-- Queries cache --> 
    <cache name="org.hibernate.cache.StandardQueryCache" 
    maxElementsInMemory="1000" 
    eternal="false" 
    timeToLiveSeconds="120" 
    overflowToDisk="true"/> 
     
    <cache name="org.hibernate.cache.UpdateTimestampsCache" 
    maxElementsInMemory="5000" 
    eternal="true" 
    overflowToDisk="true"/> 
    <!-- Object cache --> 
     
    <cache name="com.anam.amid.bo.Action" 
    maxElementsInMemory="5000" 
    eternal="false" 
    overflowToDisk="true" 
    timeToIdleSeconds="6000"/> 
     
    <defaultCache 
    maxElementsInMemory="100000" 
    eternal="true" 
    overflowToDisk="true" 
    /> 
     
    </ehcache>
    est ce qu il y a un truc qui manque? Merci pour votre aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    En regardant les logs, tu verras bien si une requête est lancée vers la base ou pas.
    S'il n'y en a pas, c'est que ton cache focntionne bien.

    A mon avis, supprimer la table n'est pas une bonne technique, Hibernate doit se perdre. Supprime plutôt toutes les lignes de la table.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Comme l'a dit the-gtm, il faut également distinguer, le cache de niveau 2 et le cache de requêtes qui lui est lié.
    Si la méthode qui te renvoie tes données utilise une requête, il faut paramétrer ton cache de requête.
    Le cache standard lui est valable pour les get, load, etc...
    Voir la doc pour plus de précisions.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut
    ùerci pour vos reponse,
    j ai modiffier mon code DAo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public List loadAllBo(Class className) throws DatabaseFailureException {
     
    		try
    		{   
    			Query query = getSession().createQuery("From Action").setCacheable(true);
     
    			return query.list() ;
    		}
    		catch (DataAccessException  e)
    		{
    			throw new DatabaseFailureException("Exception de type dataAccessException au niveau de la méthode loadAllBo "+e.getMessage());
    		}
     
    	}
    Mnt même si je modiffie un champq ds la Bd j ai tjr l ancien résultats,

    pourqoui ça n as pas marcher avec ceci??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List allBo=getHibernateTemplate().loadAll(className); 
    return allBo ;
    est ce qu il y a moyen de faire marcher le cache d cette façon

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/08/2007, 18h07
  2. Je veux tester que ce String est bien un double
    Par poulette3000 dans le forum Langage
    Réponses: 5
    Dernier message: 31/07/2007, 12h03
  3. Comment m'assurer que mon fichier est bien un exec unix
    Par Khaled.Noordin dans le forum Apple
    Réponses: 5
    Dernier message: 05/07/2007, 18h37
  4. Réponses: 7
    Dernier message: 30/12/2006, 17h13

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