Hi guys,
I have been trying to prove ehcache work with a testcase
in appfuse without luck. Can someone enlighten me a bit?
Basically, I added the config as below and turned on
logging to DEBUG but cache just doesn't seem to be working.
i.e.
I added
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop
key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
to sessionFactory bean in applicationContext-hibernate.xml as
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
....
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">@HIBERNATE-DIALECT@</prop>
<prop key="hibernate.query.substitutions">true 'Y', false
'N'</prop>
<!-- Create/update the database tables automatically when the
JVM starts up
<prop key="hibernate.hbm2ddl.auto">update</prop> -->
<!-- Turn batching off for better error messages under
PostgreSQL
<prop key="hibernate.jdbc.batch_size">0</prop> -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop
key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
</bean>
then add xdoclet to the pojo such that generated mapping file looks like
...
<class name="org.i18nfuse.model.ApplicationResource" table="app_resource"
lazy="true">
<cache usage="read-write"/>
.....
<setname="keyValues" lazy="true" inverse="true" cascade="all">
<cache usage="read-write"/>
<key column="app_resource_id"></key>
<one-to-many class="org.i18nfuse.model.KeyValue"/>
</set>
</class>
...
also added to applicationContext-service.xml the line as below for test cases
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />
the ehcache.xml is just the default one from appfuse
then write up a simple test case such as
public class ApplicationResourcePerformance2Test extends BaseDaoTestCase {
private ApplicationResourceDao dao = null;
// bean defined in applicationContext-service.xml
private CacheManager cacheManager;
public void setApplicationResourceDao(ApplicationResourceDao dao) {
this.dao = dao;
}
public void setCacheManager(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
public void testCachePerformance() throws Exception {
for (int i = 0; i < 1000; i++ ) {
ApplicationResource appRes = new ApplicationResource(
String.valueOf(i), String.valueOf(i), String.valueOf(i));
}
StopWatch watch = new StopWatch();
watch.start();
// retrieve all mock data as above
List appResList = dao.getApplicationResources(null);
watch.stop();
logger.info( "loading time before caching: " + watch.getTime() );
printCacheInfo();
watch.reset();
dao.flush();
// print cache info
printCacheInfo();
watch.start();
appResList = dao.getApplicationResources(null);
watch.stop();
logger.info( "loading time after caching: " + watch.getTime() );
}
private void printCacheInfo() {
String names[] = cacheManager.getCacheNames();
Cache tempCache;
for (int i = 0; i < names.length; i++) {
tempCache = cacheManager.getCache(names[i]);
logger.info("cache name: " + names[i] + ", size: " + tempCache.getSize());
}
}
}
the log for printCacheInfo() is like
[i18nfuse] INFO [main] SettingsFactory.buildSettings(204) | Order SQL updates
by primary key: disabled
[i18nfuse] INFO [main] SettingsFactory.createQueryTranslatorFactory(369) |
Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
[i18nfuse] INFO [main] ASTQueryTranslatorFactory.<init>(24) | Using
ASTQueryTranslatorFactory
[i18nfuse] INFO [main] SettingsFactory.buildSettings(212) | Query language
substitutions: {true='Y', false='N'}
[i18nfuse] INFO [main] SettingsFactory.buildSettings(217) | JPA-QL strict
compliance: disabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(222) | Second-level cache:
enabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(226) | Query cache:
disabled
[i18nfuse] INFO [main] SettingsFactory.createCacheProvider(356) | Cache
provider: org.hibernate.cache.EhCacheProvider
[i18nfuse] INFO [main] SettingsFactory.buildSettings(241) | Optimize cache for
minimal puts: disabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(250) | Structured
second-level cache entries: disabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(277) | Statistics: disabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(281) | Deleted entity
synthetic identifier rollback: disabled
[i18nfuse] INFO [main] SettingsFactory.buildSettings(296) | Default
entity-mode: pojo
[i18nfuse] INFO [main] SessionFactoryImpl.<init>(161) | building session factory
[i18nfuse] WARN [main] EhCacheProvider.buildCache(86) | Could not find
configuration [org.i18nfuse.model.ApplicationResource]; using defaults.
[i18nfuse] WARN [main] EhCacheProvider.buildCache(86) | Could not find
configuration [org.i18nfuse.model.KeyValue]; using defaults.
[i18nfuse] INFO [main] SessionFactoryObjectFactory.addInstance(82) | Not
binding factory to JNDI, no JNDI name configured
[i18nfuse] WARN [main] CacheManager.detectAndFixDiskStorePathConflict(302) |
Creating a new instance of CacheManager using the diskStorePath
"C:\DOCUME~1\samuel\LOCALS~1\Temp\" which is already used by an existing
CacheManager.
The source of the configuration was classpath.
The diskStore path for this CacheManager will be set to
C:\DOCUME~1\samuel\LOCALS~1\Temp\\ehcache_auto_created_1188645946453.
To avoid this warning consider using the CacheManager factory methods to create
a singleton CacheManager or specifying a separate ehcache configuration
(ehcache.xml) for each CacheManager instance.
[i18nfuse] INFO [main]
ApplicationResourcePerformance2Test.startNewTransaction(309) | Began
transaction (1): transaction manager [EMAIL PROTECTED]; default rollback = true
[i18nfuse] INFO [main]
ApplicationResourcePerformance2Test.testCachePerformance2(45) | loading time
before caching: 609
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(62) |
# of cache regions: 2
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(66) |
cache name: org.i18nfuse.model.ApplicationResource, size: 0
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(66) |
cache name: userCache, size: 0
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(62) |
# of cache regions: 2
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(66) |
cache name: org.i18nfuse.model.ApplicationResource, size: 0
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.printCacheInfo(66) |
cache name: userCache, size: 0
[i18nfuse] INFO [main]
ApplicationResourcePerformance2Test.testCachePerformance2(56) | loading time
after caching: 0
[i18nfuse] INFO [main] ApplicationResourcePerformance2Test.endTransaction(275)
| Rolled back transaction after test execution
[i18nfuse] INFO [Thread-2] SessionFactoryImpl.close(767) | closing
as you can see above, although loading time seems to have greatly reduced
in loading all ApplicationResource pojo with dao.getApplicationResources(null);
, the log in printCacheInfo() indicates the cache never stored anything!!!
What am I doing wrong? Help.
Thanks
Sam