|
My application accepts many REST calls in parallel and every rest call is very DB write extensive.
So I expect all the parallel threads to write on different tables in parallel. Definitively they don't write in same row of a table; but insert on different row.
But what I am see is that at a single instance only one thread is allowed to call save() method of Domains. To be more specific, when one thread is trying to execute Domain.save() or Domain.validate() method, it is checking if any other thread is already doing any of these two in any other Domain. If yes, then it gets locked.
Due to this behavior on average only 10% time my each thread is in Runnable status and 90% time spent in waiting.
I am using Hibernate 2.1.0 and Grails 2.1.0.
I am see all my threads are locked at following ..
at java.util.Collections$SynchronizedMap.get(Unknown Source) - locked [0x0000000042f22700] (a java.util.Collections$SynchronizedMap) at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:134) at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:324) at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:727) at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721) at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:209) at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.cascadeValidationToOne(GrailsDomainClassValidator.java:257) at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.cascadeValidationToMany(GrailsDomainClassValidator.java:164) at org.codehaus.groovy.grails.orm.hibernate.validation.HibernateDomainClassValidator.cascadeValidationToMany(HibernateDomainClassValidator.java:89) at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.cascadeToAssociativeProperty(GrailsDomainClassValidator.java:137) at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:87) at org.codehaus.groovy.grails.orm.hibernate.validation.HibernateDomainClassValidator.validate(HibernateDomainClassValidator.java:59) at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractSavePersistentMethod.doInvokeInternal(AbstractSavePersistentMethod.java:170) at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.invoke(AbstractDynamicPersistentMethod.java:63) at org.codehaus.groovy.grails.commons.metaclass.DynamicMethodInvocation$invoke.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at org.codehaus.groovy.grails.commons.metaclass.DynamicMethodInvocation$invoke.call(Unknown Source) at org.codehaus.groovy.grails.orm.hibernate.HibernateGormInstanceApi.save(HibernateGormEnhancer.groovy:856)
|