我有一个应用程序(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()
初始提取和后续查询是以不同的方法进行的,意味着不同的会话。 当我在相同的方法中一个接一个地进行初始获取两次时,它工作正常(在控制台中只打印了一个查询)。
帮助将不胜感激。我在这里犯了什么错吗?