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 :

Hibernate et EHCache


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Hibernate et EHCache
    Bonsoir,

    je suis un débutant en Java et j'ai pour but de faire un petit serveur pour mon jeu. J'utilise Hibernate 4.1 et JPA pour gérer ma base de donnée. J'ai par exemple une table "maps" qui contiendra certaines informations pour des cartes du jeu. De plus, la classe Java servira également à gérer les joueurs présent sur là-dite carte.
    Le temps de bien assimiler ces notions, je m’entraîne à mettre en cache tous les comptes que ma base de donnée contient. Voici la classe Java :

    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
     
    package org.shivas.server.database.models;
     
    // j'ai enlevé volontairement les imports ici
     
    @Entity
    @Table(name="accounts")
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    public class Account implements Serializable {
     
    	private static final long serialVersionUID = -4407008686315825783L;
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column(nullable=false)
    	private int id;
     
    	@Version
    	private long version;
     
    	@Column(nullable=false, unique=true)
    	private String name;
     
    	@Column(nullable=false)
    	private String password;
     
    	public Account() { // pour voir le nombre d'instance créée
    		System.out.println("new " + getClass().getName());
    	}
     
        // [...] getters and setters
    }
    Ensuite, mon persistence.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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence 
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
        <persistence-unit name="default">
        	<class>org.shivas.server.database.models.Account</class>
     
            <properties>
                <!--
                <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.archive.autodetection" value="class, hbm"/>
                -->
                <property name="hibernate.hbm2ddl.auto" value="update"/>
     
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
                <property name="hibernate.connection.password" value="***"/>
                <property name="hibernate.connection.url" value="jdbc:mysql://***/***"/>
                <property name="hibernate.connection.username" value="***"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
     
                <property name="hibernate.c3p0.min_size" value="1"/>
                <property name="hibernate.c3p0.max_size" value="5"/>
                <property name="hibernate.c3p0.timeout" value="300"/>
                <property name="hibernate.c3p0.max_statements" value="50"/>
                <property name="hibernate.c3p0.idle_test_period" value="3000"/>
     
                <property name="hibernate.cache.use_second_level_cache" value="true"/>
                <property name="hibernate.cache.use_query_cache" value="true"/>
                <property name="hibernate.cache.default_cache_concurrency_strategy" value="DISABLE_SELECTIVE"/>
                <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
            </properties>
        </persistence-unit>
    </persistence>
    Le fichier de configuration d'EHCache, ehcache.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <ehcache>
    <defaultCache
           eternal="true"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           maxElementsInMemory="999999999"
           />
    </ehcache>
    Et enfin, ma classe de test :

    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
     
    package org.shivas.server;
     
    import java.util.Map;
     
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
     
    import org.joda.time.DateTime;
    import org.shivas.server.database.models.Account;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
     
    import junit.framework.TestCase;
     
    public class DatabaseTest extends TestCase {
     
    	private static final Logger log = LoggerFactory.getLogger(DatabaseTest.class);
     
    	private EntityManagerFactory emf;
    	private EntityManager em;
     
    	private Account account;
    	private DateTime modification;
     
    	protected void setUp() throws Exception {
    		super.setUp();
     
    		emf = Persistence.createEntityManagerFactory("default");
    		em  = emf.createEntityManager();
     
    		account = em.createQuery("from Account a where a.id=1", Account.class).getSingleResult();
    		modification = DateTime.now();
    		account.setName("" + modification.getMillis());
     
    		em.close();
    		em = emf.createEntityManager();
    	}
     
    	protected void tearDown() throws Exception {
    		super.tearDown();
     
    		em.close();
    		emf.close();
    	}
     
    	public void test1() {
    		Account account = em.createQuery("from Account a where a.id=1", Account.class).getSingleResult();
     
    		assertEquals("" + modification.getMillis(), account.getName());
    	}
     
     
     
    }
    Malheureusement, trois instances de la classe Account sont créées bien que j'utilise la même requête.
    Certaines notions doivent complètement m'échapper mais j'aimerais avoir une seule instance de la classe Java correspondant à la ligne N°1 de ma table "accounts", contenue dans ma base de donnée MySQL.

    Je vous souhaite une bonne soirée !

  2. #2
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Ce que tu constates est normal car dans ton mapping tu définis un cache d'objets alors que tu souhaites utiliser un cache de requêtes.

    En gros, l'utilisation par Hibernate du cache d'objets se fait sur les opérations de chargement par clé (opération get(...) sur la session ou chargement par lazy-load).

    Comme ton test se base sur du chargement de données par requête HQL : même si ton cache se remplit (certainement dès l'exécution de ta 1ère requête), il n'est pas utilisé pour les requêtes suivantes.
    Regarde la doc d'Hibernate qui contient un chapitre sur les caches de requêtes : de mémoire, ton objet Query doit être défini avec un setCacheable(true)

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir, merci d'avoir poster une réponse

    malheureusement, je n'ai pas la méthode setCacheable(boolean) ni sur l'interface Query ni sur l'interface TypedQuery ... J'utilise JPA ainsi qu'Hibernate.

  4. #4
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Je ne connais pas assez bien JPA mais apparemment tu peux utiliser les "queryHint".
    Un exemple ici avec une requête nommée.
    Côté API JPA, tu peux utiliser la méthode setHint sur un objet de type Query (voir ici)

Discussions similaires

  1. [EhCache] Configuration avec Hibernate & Spring
    Par kilicool dans le forum Hibernate
    Réponses: 9
    Dernier message: 23/09/2009, 13h44
  2. [Liferay] Ehcache et Hibernate
    Par neophyse dans le forum Portails
    Réponses: 1
    Dernier message: 23/09/2009, 09h25
  3. [Hibernate][EHCache]Timeout non respecté
    Par TiMiD dans le forum Hibernate
    Réponses: 1
    Dernier message: 05/09/2007, 14h59
  4. [Hibernate][ehcache][criteria]Requête ignore le cache
    Par BugFactory dans le forum Hibernate
    Réponses: 1
    Dernier message: 25/07/2006, 10h53

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