The application I manage is a Spring1.2/Hibernate3/Weblogic8.1sp5
We're seeing that under load the Weblogic threads get locked doing the following:
org.hibernate.cache.ReadOnlyCache.get(ReadOnlyCache.java:33)
Is the cache setup correctly for these collections?
I'm at a loss as to where to look next. Directions?
The full thread dump:
"ExecuteThread: '57' for queue: 'weblogic.kernel.Default'" daemon prio=5 tid=0x0025f290 nid=0x47 waiting for monitor entry [0xa1f00000..0xa1f019c0]
at org.hibernate.cache.ReadOnlyCache.get(ReadOnlyCache.java:33)
- waiting to lock <0xbfbbb3e8> (a org.hibernate.cache.ReadOnlyCache)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:438)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:314)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:151)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:655)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:261)
at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:160)
at org.hibernate.collection.PersistentSet.initializeFromCache(PersistentSet.java:97)
at org.hibernate.cache.entry.CollectionCacheEntry.assemble(CollectionCacheEntry.java:35)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.initializeCollectionFromCache(DefaultInitializeCollectionEventListener.java:130)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:48)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1430)
at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:280)
at org.hibernate.engine.PersistenceContext.initializeNonLazyCollections(PersistenceContext.java:796)
at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:520)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:460)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:314)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:151)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:655)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:261)
at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:160)
at org.hibernate.type.TypeFactory.assemble(TypeFactory.java:355)
at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:74)
at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:60)
at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:495)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:460)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:314)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:167)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:621)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:614)
at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:389)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:312)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:383)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:378)
at com.XXXX.dashboard.user.UserManagerImpl.getEmployee(UserManagerImpl.java:63)
at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy9.getEmployee(Unknown Source)
at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:99)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy10.getEmployee(Unknown Source)
at com.XXXX.dashboard.authentication.web.AuthenticationServiceImpl.getEmployee(AuthenticationServiceImpl.java:51)
at com.XXXX.dashboard.authentication.web.AuthenticationServiceImpl.getEmployee(AuthenticationServiceImpl.java:224)
at com.XXXX.dashboard.authentication.web.AuthenticationFilter.examineRequest(AuthenticationFilter.java:269)
at com.XXXX.dashboard.authentication.web.AuthenticationFilter.doFilter(AuthenticationFilter.java:170)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6987)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
Yes, I know it's happening around AuthenticationServiceImpl.getEmployee(). I'm assuming based on the dump that it's trying to load a collection. There are Sets on my employee:
Code:
package com.XXXX.dashboard.user;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.XXXX.dashboard.reports.ReportAudience;
import com.XXXX.dashboard.reports.ReportDescriptor;
import com.XXXX.dashboard.user.acl.EmployeeAcl;
import com.XXXX.dashboard.user.acl.UserAcl;
/**
* @hibernate.class table = "PSFT_EMPLOYEE" polymorphism="explicit"
* @hibernate.cache usage = "read-write" lazy="false"
*/
public class Employee extends BaseEmployee
implements Serializable {
public static final String DEFAULT_DEPARTMENT_ID = "0000000000";
public static final String DEFAULT_MANAGER_ID = "000000";
public static final String DEFAULT_COST_CENTER = "0";
private static final long serialVersionUID = -5450022397980854742L;
private static Log log = LogFactory.getLog(Employee.class);
private String departmentId; //primary key of Department object.
private String managerId; //empId of manager
private String middleName;
private String companyCode;
private String mailstop;
private String departmentDescription;
private char managerFlag;
private String jobCode;
private String address;
private String city;
private String state;
private String zip;
private String locationName;
private String region;
private String regionDescription;
private String managerName;
private String createdByEmployeeId;
private String peopleSoftCostCenter;
private Set employeeAcl = new HashSet();
private Set organizations;
private UserAcl userAcl = null;
private JobType jobType = null;
public static final String PSFT_TYPE = "PSFT";
public static final String APP_TYPE = "APP";
private Set assignedFCs;
public Employee() {
super();
}
/**
* @hibernate.set table="PSFT_EMPLOYEE_FC" lazy="false" cascade="all" inverse ="true"
*
* @hibernate.collection-many-to-many
* class="com.XXXX.dashboard.orgadmin.Organization" column="FC_ORGANIZATION_ID"
* @hibernate.collection-key column="EMPLOYEE_ID"
* @hibernate.collection-cache usage="read-write"
* @hibernate.set batch-size="100"
*
* @return Returns the orgs.
*/
public Set getOrganizations() {
return organizations;
}
/**
*
* @param organizations
*/
public void setOrganizations(Set organizations) {
this.organizations = organizations;
}
/**
* @hibernate.many-to-one class="com.XXXX.dashboard.user.JobType"
* column="JOBCODE" lazy="false" inverse="false"
* cascade="none" insert="false" update="false"
* outer-join="false"
* @return Returns the employee.
*/
public JobType getJobType() {
return jobType;
}
/**
* @param jobType The jobType to set.
*/
public void setJobType(JobType jobType) {
this.jobType = jobType;
}
/**
* method to allow us to get the org length in jsps (sigh)
* @return The count of organizations.
*/
public int getOrganizationCount() {
if (organizations != null) {
return organizations.size();
} else {
return 0;
}
}
/**
* @hibernate.property column="DIRECT_MGR_NAME"
* @return Returns the managerName.
*/
public String getManagerName() {
return managerName;
}
/**
* @param managerName The managerName to set.
*/
public void setManagerName(String managerName) {
this.managerName = managerName;
}
/**
* @hibernate.property column="LOCATION_NAME"
* @return Returns the locationName.
*/
public String getLocationName() {
return locationName;
}
/**
* @param locationName The locationName to set.
*/
public void setLocationName(String locationName) {
this.locationName = locationName;
}
public String getLocationNameEncoded() {
String out = locationName;
try {
out = URLEncoder.encode(locationName, "UTF-8");
} catch (UnsupportedEncodingException e) {
// should never happen since we're using UTF-8
log.error("Encoding should be UTF-8.", e);
}
log.debug("locationNameEncoded: " + out);
return out;
}
/**
* @hibernate.property column="LOCATION_ZIP"
* @return Returns the zip.
*/
public String getZip() {
return zip;
}
/**
* @param zip The zip to set.
*/
public void setZip(String zip) {
this.zip = zip;
}
/**
* @hibernate.property column="LOCATION_CITY"
* @return Returns the locationCity.
*/
public String getCity() {
return city;
}
/**
* @param city The locationCity to set.
*/
public void setCity(String city) {
this.city = city;
}
/**
* @hibernate.property column="LOCATION_ADDRESS"
* @return Returns the locationAddress.
*/
public String getAddress() {
return address;
}
/**
* @param address The locationAddress to set.
*/
public void setAddress(String address) {
this.address = address;
}
/**
* @hibernate.property column="JOBCODE"
* @return Returns the jobCode.
*/
public String getJobCode() {
return jobCode;
}
/**
* @param jobCode The jobCode to set.
*/
public void setJobCode(String jobCode) {
this.jobCode = jobCode;
}
/**
* @hibernate.property column="COMPANY_NUMBER"
* @return Returns the companyCode.
*/
public String getCompanyCode() {
return companyCode;
}
/**
* @param companyCode The companyCode to set.
*/
public void setCompanyCode(String companyCode) {
this.companyCode = companyCode;
}
/**
* @hibernate.property column="DEPT_DESCRIPTION"
* @return Returns the department description.
*/
public String getDepartmentDescription() {
return departmentDescription;
}
/**
* @param departmentDescription The department description to set.
*/
public void setDepartmentDescription(String departmentDescription) {
this.departmentDescription = departmentDescription;
}
/**
* @hibernate.property column="LOCATION_MAILSTOP"
* @return Returns the mailstop.
*/
public String getMailstop() {
return mailstop;
}
/**
* @param mailstop The mailstop to set.
*/
public void setMailstop(String mailstop) {
this.mailstop = mailstop;
}
/**
* @hibernate.property column="DEPT_MGR_FLAG"
* @return Returns the managerFlag.
*/
public char getManagerFlag() {
return managerFlag;
}
/**
* @param managerFlag The managerFlag to set.
*/
public void setManagerFlag(char managerFlag) {
this.managerFlag = managerFlag;
}
/**
* @hibernate.property column="DIRECT_MGR_ID"
* @return Returns the managerId.
*/
public String getManagerId() {
return managerId;
}
/**
* @param managerId The managerId to set.
*/
public void setManagerId(String managerId) {
this.managerId = managerId;
}
/**
* @hibernate.property column="MIDDLE_NAME"
* @return Returns the middleName.
*/
public String getMiddleName() {
return middleName;
}
/**
* @param middleName The middleName to set.
*/
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
/**
* @hibernate.property column="DEPTID"
* update="false"
* @return Returns the department's ID.
*/
public String getDepartmentId() {
return departmentId;
}
/**
* @param departmentId The departmentId to set.
*/
public void setDepartmentId(String departmentId) {
this.departmentId = departmentId;
}
/**
* @hibernate.property column="LOCATION_STATE"
* @return Returns the locationState.
*/
public String getState() {
return state;
}
/**
* @param state The locationState to set.
*/
public void setLocationState(String state) {
this.state = state;
}
/**
* @param state The state to set.
*/
public void setState(String state) {
setLocationState(state);
}
/**
* @hibernate.property column="FC_REGION"
* @return Returns the region.
*/
public String getRegion() {
return region;
}
/**
* @param region The region to set.
*/
public void setRegion(String region) {
this.region = region;
}
/**
* @return Returns the UserAcl.
*/
public UserAcl getAcl() {
//log.debug("Getting user acl...");
if (userAcl !=null ){
return userAcl;
} else {
userAcl =new UserAcl(employeeAcl, this);
return userAcl ;
}
}
/**
* @return Returns the UserAcl.
*/
public void setAcl(UserAcl userAcl) {
log.debug("Setting user acl...");
this.userAcl =userAcl;
}
/**
* @param code The ACL code name.
* @param allowed True if allowed, otherwise false.
*/
public void addEmployeeAcl(String code, boolean allowed) {
EmployeeAcl empAcl = new EmployeeAcl();
empAcl.setCode(code);
if(allowed) {
empAcl.setAllow("Y");
} else {
empAcl.setAllow("N");
}
addEmployeeAcl(empAcl);
}
/**
* Adds an ACL relationship for an employee.
* @param empAcl
*/
public void addEmployeeAcl(EmployeeAcl empAcl) {
log.debug("addEmployeeAcl(" + empAcl.getCode() + ","
+ empAcl.getAllow() + ")");
// first see if we already have that acl already
Iterator iter = employeeAcl.iterator();
while(iter.hasNext()) {
EmployeeAcl testEmpAcl = (EmployeeAcl)iter.next();
if(testEmpAcl != null && testEmpAcl.getCode() != null
&& testEmpAcl.getCode().equals(empAcl.getCode())) {
// We only need to update in this case
log.debug("Found existing acl, updating.");
testEmpAcl.setAllow(empAcl.getAllow());
return;
}
}
// Didn't find it, we need to insert it
log.debug("Adding new acl...");
empAcl.setEmployee(this);
employeeAcl.add(empAcl);
}
/**
* @hibernate.set lazy="false" cascade="all" inverse="true" insert="true"
* @hibernate.collection-one-to-many class="com.XXXX.dashboard.user.acl.EmployeeAcl"
* @hibernate.collection-key column="EMPLOYEE_ID"
* @hibernate.collection-cache usage="read-write"
* @hibernate.set batch-size="100"
*
* @return Returns the employeeAcl.
*/
public Set getEmployeeAcl() {
return employeeAcl;
}
/**
* @param employeeAcl The employeeAcl to set.
*/
public void setEmployeeAcl(Set employeeAcl) {
this.employeeAcl = employeeAcl;
}
/**
* @param report
* @return true if employee is allowed access to the report
*/
public boolean canAccessReport(ReportDescriptor report) {
boolean result = false;
if (report.getAudienceList().contains(ReportAudience.EVERYONE)) {
result = true;
}
if (report.getAudienceList().contains(ReportAudience.EXECUTIVE)
&& this.getAcl().getReports().getCanViewExecutiveReports()) {
result = true;
}
if (report.getAudienceList().contains(ReportAudience.CAMPAIGN_OWNER)
&&((this.getAcl().getCampaign().isOwner()) || this.getAcl().getReports().getCanViewCampaignOwnerReports())) {
//this.getAcl().getCampaign().isOwner()) {
result = true;
}
if (report.getAudienceList().contains(ReportAudience.FC_MANAGER)
&& (this.getJobType().isLineManager() || this.getAcl().getReports().getCanViewManagerReports())) {
result = true;
}
if (report.getAudienceList().contains(ReportAudience.EXECUTIVE)
&& (this.getAcl().getReports().getCanViewExecutiveReports())) {
result = true;
}
if (report.getAudienceList().contains(ReportAudience.FC_NONMANAGER)
&& this.getAcl().getReports().getCanViewNonManagerReports()) {
result = true;
}
return result;
}
/**
*
* @return Returns the List.
*/
public List getReportAudiences() {
log.debug("Getting ReportAudiences...");
List reportAudiences = new ArrayList(5);
reportAudiences.add(ReportAudience.EVERYONE);
// If an user can upload a report , then he/she can view reports of all audience type.
if(this.getAcl().getReports().getCanUpload()) {
reportAudiences.add(ReportAudience.FC_MANAGER);
reportAudiences.add(ReportAudience.EXECUTIVE);
reportAudiences.add(ReportAudience.CAMPAIGN_OWNER);
reportAudiences.add(ReportAudience.FC_NONMANAGER);
}else{
// If an user cannot upload a report, then all his permission settings has to be verfied.
if (this.getAcl().getReports().getCanViewManagerReports()) {
reportAudiences.add(ReportAudience.FC_MANAGER);
}
if (this.getAcl().getReports().getCanViewExecutiveReports()) {
reportAudiences.add(ReportAudience.EXECUTIVE);
}
if (this.getAcl().getReports().getCanViewCampaignOwnerReports()) {
reportAudiences.add(ReportAudience.CAMPAIGN_OWNER);
}
if (this.getAcl().getReports().getCanViewNonManagerReports()) {
reportAudiences.add(ReportAudience.FC_NONMANAGER);
}
}
return reportAudiences;
}
/**
* @return The employee's "full name"
*/
public String getFullName() {
StringBuffer fullName = new StringBuffer(getFirstName());
if(!StringUtils.isBlank(getMiddleName())) {
fullName.append(" ");
fullName.append(getMiddleName());
}
fullName.append(" ");
fullName.append(getLastName());
return fullName.toString();
}
/**
* @param id
* @return A properly zero-padded String key based on the incoming id.
*/
public static String prefixWithZeros(String id) {
if (id == null || id.length() < 1) {
return "000000";
}
int length = id.length();
StringBuffer sb = new StringBuffer();
// all employee ids seem to have length 6
for (int i = 0; i < (6 - length); i++) {
sb.append("0");
}
return sb.append(id).toString();
}
public String toString() {
return "Employee: "+getId()+" - "+getLastName()+", "+getFirstName();
}
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof Employee)) {
return false;
}
Employee emp = (Employee)object;
if(getEmployeeId().equals(emp.getEmployeeId())) {
return true;
}
return false;
}
public int hashCode() {
return getEmployeeId().hashCode();
}
/**
* @hibernate.property column = "FC_REGION_DESCRIPTION"
* @return The description of the region.
*/
public String getRegionDescription() {
return regionDescription;
}
public void setRegionDescription(String regionDescription) {
this.regionDescription = regionDescription;
}
/**
* @hibernate.property column = "CREATED_BY_EMPLOYEE_ID"
* @return The employee who created this employee record.
*/
public String getCreatedByEmployeeId() {
return createdByEmployeeId;
}
public void setCreatedByEmployeeId(String createdByEmployeeId) {
this.createdByEmployeeId = createdByEmployeeId;
}
/**
* @hibernate.set table="PSFT_EMPLOYEE_FC" lazy="true" cascade="all"
* @hibernate.collection-key column="EMPLOYEE_ID"
* @hibernate.collection-element column = "ASSIGNED_FC" type = "java.lang.String" not-null = "true" unique = "false"
*
* @return Returns the employees.
*/
public Set getAssignedFCs() {
return assignedFCs;
}
public void setAssignedFCs(Set assignedFCs) {
this.assignedFCs = assignedFCs;
}
/**
* @hibernate.property column="COST_CENTER" insert="false" update="false"
* @return The cost center that peoplesoft assumes this employee has.
*/
public String getPeopleSoftCostCenter() {
return peopleSoftCostCenter;
}
public void setPeopleSoftCostCenter(String peopleSoftCostCenter) {
this.peopleSoftCostCenter = peopleSoftCostCenter;
}
}
Then finally the ehcache.xml
Code:
<?xml version="1.0"?>
<ehcache>
<!--Default Cache configuration. These will applied to caches programmatically created through the CacheManager.
The following attributes are required:
maxElementsInMemory - Sets the maximum number of objects that will be created in memory
eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element is never expired.
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache has reached the maxInMemory limit.
The following attributes are optional:
timeToIdleSeconds - Sets the time to idle for an element before it expires.
i.e. The maximum amount of time between accesses before an element expires
Is only used if the element is not eternal.
Optional attribute. A value of 0 means that an Element can idle for infinity.
The default value is 0.
timeToLiveSeconds - Sets the time to live for an element before it expires.
i.e. The maximum time between creation time and when an element expires.
Is only used if the element is not eternal.
Optional attribute. A value of 0 means that and Element can live for infinity.
The default value is 0.
diskPersistent - Whether the disk store persists between restarts of the Virtual Machine.
The default value is false.
diskExpiryThreadIntervalSeconds- The number of seconds between runs of the disk expiry thread. The default value
is 120 seconds.
-->
<!-- Sets the path to the directory where cache .data files are created. -->
<diskStore path="user.home"/>
<defaultCache
maxElementsInMemory="250"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="30"
overflowToDisk="false"/>
<cache
name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="30"
overflowToDisk="false"/>
<cache
name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="30"
overflowToDisk="false"/>
<cache
name="com.wamu.dashboard.user.Employee"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false"/>
<cache
name="com.wamu.dashboard.user.Employee.organizations"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false"/>
<cache
name="com.wamu.dashboard.user.Employee.employeeAcl"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false"/>
<cache name="com.wamu.dashboard.orgadmin.Organization"
maxElementsInMemory="900"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false"
/>
<cache
name="com.wamu.dashboard.user.acl.EmployeeAcl"
maxElementsInMemory="300"
eternal="false"
timeToIdleSeconds="240"
timeToLiveSeconds="240"
overflowToDisk="false"/>
<cache
name="com.wamu.dashboard.user.acl.Acl"
maxElementsInMemory="40"
eternal="true"
overflowToDisk="false"/>
</ehcache>