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 :
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 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 }
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
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>
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 <ehcache> <defaultCache eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" maxElementsInMemory="999999999" /> </ehcache>
Malheureusement, trois instances de la classe Account sont créées bien que j'utilise la même 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
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()); } }
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 !
Partager