【问题标题】:JBossCache as a second level cache for Hibernate in JBoss 5JBossCache 作为 JBoss 5 中 Hibernate 的二级缓存
【发布时间】:2010-11-29 09:58:07
【问题描述】:

这是我的配置:Hibernate 3.3.1.GA、JBoss 5.1.0.GA、JBoss Cache 3.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 Cache 3.2 和 JBoss 5.1?我对 JndiSharedJBossCacheRegionFactory 和 JndiMultiplexedJBossCacheRegionFactory 特别感兴趣。

【问题讨论】:

标签: hibernate jboss5.x second-level-cache jboss-cache


【解决方案1】:

我看过这个并得出结论,用于解析和部署 hibernate.cfg.xml 文件的 JBoss AS 机制过于脆弱,并且在 Hibernate 的配置选项方面容易过时支持。我已经打开 https://jira.jboss.org/jira/browse/JBAS-7411 并提出了改进此问题的可能方法的建议。

【讨论】:

    【解决方案2】:

    @Yury Litvinov,这些属性是尚未映射到休眠 MBean 属性的新属性,因为不再维护休眠 MBean。我不建议您将 Hibernate 部署为 MBean。

    【讨论】:

      【解决方案3】:

      回答我自己的问题。

      事实证明,如果你将 Hibernate 作为 mbean 启动,那么你不能在 JBoss 5.1 中将 JBoss Cache 与 Hibernate 一起使用,即将 Hibernate 配置文件放入 JBoss 服务器的部署文件夹中。

      发生这种情况是因为 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();
      

      【讨论】:

        【解决方案4】:

        经过一番调查,我设法用这个配置启动了 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”。

        如果不指定此参数,我将无法控制将使用哪个缓存实例来缓存条目、集合和查询。

        【讨论】:

          猜你喜欢
          • 2016-03-24
          • 1970-01-01
          • 2010-10-16
          • 2021-10-07
          • 2016-04-18
          • 2015-05-14
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          相关资源
          最近更新 更多