簡體   English   中英

JBossCache作為JBoss 5中Hibernate的二級緩存

[英]JBossCache as a second level cache for Hibernate in JBoss 5

這是我的配置:Hibernate 3.3.1.GA,JBoss 5.1.0.GA,JBoss Cache3.2.0.GA。

我正在按此處所述進行Hibernate配置: http : //www.jboss.org/community/wiki/ClusteredJPAHibernateSecondLevelCachinginJBossAS5

<hibernate-configuration>

    <session-factory>

         <property name="cache.use_second_level_cache">true</property>
         <property name="cache.use_query_cache">true</property>
         <property name="cache.region.factory_class">org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactoryctory</property>
         <property name="cache.region.jbc2.cachefactory>java:CacheManager</property>
         <property name="cache.region.jbc2.cfg.entity">mvcc-entity</property>
         <property name="cache.region.jbc2.cfg.query">local-query</property>
         <property name="cache.region_prefix">tempdb</property>

         ... other non-caching related configuration

    </session-factory>

</hibernate-configuration>

但收到錯誤,指出指定的屬性無效:

Caused by: java.lang.IllegalArgumentException: No such property cache for bean org.jboss.hibernate.jmx.Hibernate available [statisticsServiceName, beanName, defaultSchema, defaultCatalog, sessionFactoryName, querySubstitutions, secondLevelCacheEnabled, password, version, statGenerationEnabled, maxFetchDepth, username, useStructuredCacheEntriesEnabled, datasourceName, dirty, streamsForBinaryEnabled, getGeneratedKeysEnabled, hbm2ddlAuto, minimalPutsEnabled, instance, jdbcBatchSize, jdbcScrollableResultSetEnabled, cacheRegionFactoryClass, dialect, scanForMappingsEnabled, runningSince, cacheRegionPrefix, class, cacheProviderClass, sessionFactoryRunning, batchVersionedDataEnabled, harUrl, queryCacheEnabled, sessionFactoryInterceptor, deployedCacheManagerJndiName, showSqlEnabled, reflectionOptimizationEnabled, jdbcFetchSize, listenerInjector, sqlCommentsEnabled, deployedCacheJndiName, controller]

因此,我不能使用“ cache.region.factory_class”屬性,而只能使用“ cacheRegionFactoryClass”(在異常中顯示)。

我不能使用任何其他屬性(例如cache.region。*),因此無法為我的休眠配置二級緩存。

誰能給我鏈接如何用JBoss 5.1配置JBoss Cache 3.2? 我對JndiSharedJBossCacheRegionFactory和JndiMultiplexedJBossCacheRegionFactory尤其感興趣。

回答我自己的問題。

事實證明,如果您以mbean啟動Hibernate,即無法將Jibers配置文件放入JBoss服務器的deploy文件夾,則無法在JBoss 5.1中將JBoss Cache與Hibernate一起使用。

發生這種情況是因為mbean不接受“ hibernate.cache。*”之類的參數(而這正是異常所在)。

所以我的解決方案是從Java代碼初始化Hibernate並獲得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();

@Yury Litvinov,這些屬性是尚未映射到休眠MBean屬性的新屬性,因為不再維護休眠MBean。 我不建議您將Hibernate部署為MBean。

經過一番調查后,我設法使用此配置啟動了Hibernate + JBossCache。

<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>

但是,我仍然不能指定以下參數(出現相同的錯誤):“ hibernate.cache.region.jbc2.cfg.entity”,“ hibernate.cache.region.jbc2.cfg.collection”,“ hibernate.cache” .region.jbc2.cfg.query”。

如果不指定此參數,則無法控制將哪個緩存實例用於緩存條目,集合和查詢。

我看了一下,得出的結論是,用於解析和部署hibernate.cfg.xml文件的JBoss AS機制過於脆弱,相對於Hibernate支持的配置選項而言,它很容易過時。 我已經打開https://jira.jboss.org/jira/browse/JBAS-7411 ,並提出了一種改善此問題的可行方法的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM