JBossCache en tant que cache de second niveau pour Hibernate dans JBoss 5
-
22-07-2019 - |
La solution
Répondant à ma propre question.
Il s’est avéré que vous ne pouvez pas utiliser JBoss Cache avec Hibernate dans JBoss 5.1 si vous démarrez Hibernate en tant que mbean, c’est-à-dire mettez le fichier de configuration Hibernate dans le dossier de déploiement du serveur JBoss.
Cela se produit car mbean n'accepte pas de paramètres tels que "hibernate.cache. *". (et c’est exactement ce qu’est une exception).
Ma solution consiste donc à initialiser Hibernate à partir de code Java et à utiliser hibernate.xml.
Configuration configuration = new Configuration();
Properties properties = configuration.getProperties();
properties.put("hibernate.connection.datasource", "java:/MSSQLDMDS");
properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
properties.put("hibernate.transaction.factory_class", "org.hibernate.transaction.JTATransactionFactory");
properties.put("hibernate.current_session_context_class", "org.hibernate.context.JTASessionContext");
properties.put("hibernate.transaction.manager_lookup_class", "org.hibernate.transaction.JBossTransactionManagerLookup");
properties.put("hibernate.cache.use_second_level_cache", "true");
properties.put("hibernate.cache.use_query_cache", "false");
properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory");
properties.put("hibernate.cache.region.jbc2.cachefactory", "java:CacheManager");
properties.put("hibernate.cache.region.jbc2.cfg.entity", "mvcc-entity");
File mappings = getHibernateMappingDir();
configuration.addDirectory(mappings);
sessionFactory = configuration.buildSessionFactory();
Autres conseils
@Yury Litvinov, ces propriétés sont de nouvelles propriétés qui n'ont pas été mappées vers des attributs d'hibernation de MBean car le MBean d'Hibernate n'est plus géré. Je ne recommanderais pas que vous déployiez Hibernate en tant que MBean.
Après quelques recherches, j'ai réussi à démarrer Hibernate + JBossCache avec cette configuration.
<hibernate-configuration xmlns="urn:jboss:hibernate-deployer:1.0">
<session-factory name="java:/hibernate/SessionFactory" bean="jboss.har:service=Hibernate">
<property name="datasourceName">java:/MSSQLDMDS</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hbm2ddlAuto">create</property>
<property name="secondLevelCacheEnabled">true</property>
<property name="queryCacheEnabled">false</property>
<property name="cacheProviderClass">org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory</property>
<property name="deployedCacheManagerJndiName">java:CacheManager</property>
<depends>jboss.cache:service=CacheManager</depends>
<depends>jboss:service=Naming</depends>
<depends>jboss:service=TransactionManager</depends>
</session-factory>
</hibernate-configuration>
Cependant, je ne peux toujours pas spécifier (obtenir la même erreur) les paramètres suivants: "hibernate.cache.region.jbc2.cfg.entity", "hibernate.cache.region.jbc2.cfg.collection", "hibernate.cache.region.jbc2.cfg.query".
Sans spécifier ces paramètres, je ne peux pas contrôler quelle instance de cache sera utilisée pour la mise en cache des entrées, des collections et des requêtes.
J'ai examiné la question et suis parvenu à la conclusion que le mécanisme d'analyse et de déploiement d'un fichier hibernate.cfg.xml par JBoss AS est trop fragile et risque de ne plus être à jour en ce qui concerne les options de configuration proposées par Hibernate. les soutiens. J'ai ouvert https://jira.jboss.org/jira/browse/JBAS- 7411 avec une suggestion d'un moyen possible d'améliorer cela.