2016-11-17 127 views
0

我在我的项目中使用spring data JPAHibernate重新混合。 最近,我遇到了性能问题。 我想在我的实体类中为第二级缓存添加Hibernate注释@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)。 当启动tomcat时,它会抛出Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan, for example, is available in the classpath).Hibernate + Spring Data JPA二级缓存XML

我的弹簧jpa.mxl

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 
     <!-- use annotation in Service: @Transactional --> 

    <bean id="transactionManager2" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
     <qualifier value="transactionManager2"/> 
    </bean> 

    <bean id="oracleConnection" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName"> 
      <value>java:comp/env/jdbc/OracleDB</value> 
     </property> 
    </bean> 

    <bean id="oracleTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="oracleConnection" /> 
     <qualifier value="oracleConnectionTransactionManager"/> 
    </bean> 



    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" /> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="mssqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
     <property name="url"> 
      <value>${connection.url}</value> 
     </property> 
     <property name="username"> 
      <value>${connection.username}</value> 
     </property> 
     <property name="password"> 
      <value>${[email protected]}</value> 
     </property>  
    </bean> 


    <bean id="auditInterceptor" class="com.bot.gnweb.unit.AuditIntercepter"/> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" destroy-method="destroy"> 
     <property name="dataSource" ref="mssqlDataSource" /> 
     <property name="entityInterceptor" ref="auditInterceptor"/> 
     <property name="packagesToScan"> 
      <value>com.bot.gnweb.model</value> 
     </property> 
     <property name="mappingResources"> 
      <list> 
       <value>gnwebSql.xml</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 
       <prop key="hibernate.dialect">com.bot.gnweb.model.MssqlCustomDialect</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="net.sf.ehcache.configurationResourceName">ehcache.xml</prop> 
       <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 
       <prop key="hibernate.generate_statistics">true</prop> 
      </props> 
     </property> 
    </bean> 



    <bean 
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="auditInterceptor"> 
     <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" /> 
     <property name="persistenceUnitName" value="gnWebPU" /> 
     <property name="dataSource" ref="mssqlDataSource" /> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
    </bean> 

    <!-- Spring Data --> 
    <jpa:repositories base-package="com.bot.gnweb.repository" 
     entity-manager-factory-ref="entityManagerFactory" 
     transaction-manager-ref="transactionManager" /> 

    <bean id="auditorBean" class="com.bot.gnweb.model.AuditingAware" /> 
    <jpa:auditing auditor-aware-ref="auditorBean" /> 


</beans> 

和我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    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_1_0.xsd"> 
    <persistence-unit name="gnWebPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />    
      <property name="format_sql" value="true" /> 
      <property name="default-schema" value="dbo" /> 
      <property name="hibernate.ejb.interceptor" value="com.bot.gnweb.unit.AuditIntercepter" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

和我的项目XML路径 enter image description here

回答

1

答案是字面上的错误消息:

应用程序中使用了二级缓存,但未提供属性hibernate.cache.region.factory_class,请禁用二级缓存或将正确的区域工厂类名称设置为属性hibernate.cache.region.factory_class(并make确保第二级缓存提供程序hibernate-infinispan在类路径中可用)。

你没有带配置hibernate.cache.region.factory_class

这样添加一行类似下面你persistence.xml

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> 

你可以阅读更多关于此这里:https://stackoverflow.com/a/3675579/66686

+0

我说,和问题仍然是一样的。你可以告诉我我失去了什么 –

+0

你的缓存提供程序是否在类路径中实现?你仍然看到完全相同的错误? –

相关问题