Exemple de fonctionnement d'Hibernate 3.6.2 2ème niveau de la mise en cache avec JPA2?
Le titre évidemment états : je ne peux pas faire le cache de second niveau de travail pour JPA2/Hibernate 3.6.3.
J'ai essayé beaucoup de un hack pour le faire fonctionner. Mais je suis le seul à réussir à avoir le cache de requêtes de travail. Bien que Hibernate crée les caches (nom de l'instance), ils sont ignorés. Même manque ne sont pas enregistrés. C'est peut-être une version d'une incompatibilité. J'ai essayé quelques autres, sans résultat. Et je ne me sens pas à la hauteur de la plus à essayer toutes les permutations. 😛
Je pose la question ici que certaines personnes semblent avoir de travail (dont les exemples que j'ai essayé aussi). Peut-être qu'ils peuvent repérer l'erreur évidente, je suis en train de faire.
Merci d'avance pour tout le monde de m'aider ! 🙂
persistence.xml
<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="foo" transaction-type="RESOURCE_LOCAL">
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:/opt/db/foo;create=true"/>
<property name="javax.persistence.jdbc.user" value="foo"/>
<property name="javax.persistence.jdbc.password" value="bar"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.2</version>
JMX installation
Cette façon, je peux vérifier l'utilisation des caches. Les caches sont créés (un pour chaque entité) et les deux requêtes caches sont là aussi. Ce dernier se remplir assez vite. Mais aucun des caches afficher tout manque ou de frappe. Pas même la requête caches.
ManagementService.registerMBeans( CacheManager.getInstance(), ManagementFactory.getPlatformMBeanServer(), true, true, true, true, true )
L'entité caches sont ignorés. Ils doivent contenir au moins les entités qui sont enregistrés dans la base de données. Ou être récupéré avec des requêtes. Rien ne bouge.
Exemple de code Java
EntityManager entityManager = Persistence.createEntityManagerFactory("foo").createEntityManager();
entityManager.getTransaction.begin();
entityManager.merge(bar);
entityManager.getTransaction.commit();
Query query = entityManager.createQuery("select b from Bar p where b.name = :name");
query.setParameter("name", "fooBar");
query.setHint("org.hibernate.cacheable","true");
query.getSingleResult();
La fusion fonctionne - parce qu'il y a des données dans la base de données. Et les œuvres, parce que je suis à obtenir des objets avec celle générée.
La requête de entités sont indexés sur la base de données.
WHODUNNIT ?
Yep. Et le droit des caches popup dans JMX. Seules les entités ne sont pas mis en cache lorsqu'il est interrogé. Pas lors de la persistance/fusion.
OriginalL'auteur Jan Goyvaerts | 2011-06-08
Vous devez vous connecter pour publier un commentaire.
L'un de mes projet utilise ehcache + hibernate + jpa2. Je vous dis ma configuration. Espérons qu'il vous aide.
cadre des versions (maven dependency):
Les deux hibernate versions sont testées, mais je ne l'utilise hibernate jpa2 api.
persistence.xml:
ehcache.xml:
Enfin vous devez d'annoter vos cachable classe d'entité. Voici un exemple:
Cette configuration fonctionne pour moi, j'espère qu'elle a été utile.
Je pense ici vous pouvez trouver la réponse. stackoverflow.com/questions/2020904/...
L'exemple fourni ici fonctionne, mais les entités ne sont pas mis en cache lors de la persistance. Seulement au moment d'être interrogé. C'est que la façon dont il est censé travailler ?
Je pense que cela ne cache de requêtes. Je ne sais pas comment vous mettre en cache les entités pour persister. Si vous utilisez batchinsert ou batchupdate, le pilote jdbc de gérer ce type de cache pour vous.
OriginalL'auteur lepike
Trouvé le coupable - même si c'est assez contre-intuitif:
Interrogé les entités ne sont pas mis dans le cache de second niveau, sauf si vous fermez la session ou de la personne morale gestionnaire. Même si vous actualisez les mêmes objets, toujours pas de mise en cache qui va arriver.
J'ai un long processus de traitement par lots dans lequel de nombreux objets de référence sont créés et réutilisés. Si je garde la même entité gestionnaire tout au long, je ne vois pas la fin du processus. Si je recrée le gestionnaire d'entités, à chaque cycle, l'application des mouches.
Je pensais qu'il y avait quelque chose comme un 1er niveau de cache - le contexte de persistance ?
OriginalL'auteur Jan Goyvaerts