二级缓存无法在休眠状态下工作,仍然在击中数据库

时间:2016-08-24 15:48:28

标签: spring hibernate maven caching

我有一个应用程序(Spring MVC + Hibernate),我已经设置了二级缓存。我有一张名为CARDDTl(CARDNUMBER(PK),STATUS)的表。我从此表中提取了所有数据,随后我使用where条件获取数据。因此,初始提取应该将所有内容放在缓存中,后续提取应该从缓存中发生,但不能以这种方式工作。 我的配置文件 -

<bean id="hibernate4AnnotatedSessionFactory"    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list><value>com.infosys.model.Card</value><value>com.infosys.model.TransLog</value><value>com.infosys.model.InputCard</value></list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.generate_statistics">true</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
                <prop key="net.sf.ehcache.configurationResourceName">ehcache.xml</prop>
            </props>
        </property>
    </bean>

ehcache.xml中

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">
    <diskStore path="java.io.tmpdir/ehcache" />
    <defaultCache maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="120000" timeToLiveSeconds="120000" diskSpoolBufferSizeMB="30"
        maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU" statistics="true">
        <persistence strategy="localTempSwap" />
    </defaultCache>
    <cache name="org.hibernate.cache.internal.StandardQueryCache"
        maxEntriesLocalHeap="5" eternal="false" timeToLiveSeconds="120">
        <persistence strategy="localTempSwap" />
    </cache>
    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
        maxEntriesLocalHeap="5000" eternal="true">
        <persistence strategy="localTempSwap" />
    </cache>
</ehcache>

卡片型号 - (CARDDTL表)

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Entity(name="CARDDTL")
public class Card {...}

初始提取

Session session= sessionFactory.getCurrentSession();
Query query=session.createQuery("from CARDDTL");
List<Card> cardDetailList=(List<Card>)query.setCacheable(true).list();

现在我有一个使用此查询逐个获取的持卡人列表 -

Query query=sessionFactory.getCurrentSession().createQuery("from CARDDTL where cardNumber=?");
query.setInteger(0, cardNum);
query.list()

初始提取和后续查询是以不同的方法进行的,意味着不同的会话。 当我在相同的方法中一个接一个地进行初始获取两次时,它工作正常(在控制台中只打印了一个查询)。

帮助将不胜感激。我在这里犯了什么错吗?

0 个答案:

没有答案