java - Concurrent Modification - JPA AppEngine -
im using java , jpa 1 in google app engine web app. have problem caused by: javax.transaction.xa.xaexception: concurrent modification
profile , viewedprofile corresponding getters , setters:
public class profile { ... @onetoone(cascade={cascadetype.persist, cascadetype.remove}) private viewedprofile viewed = null; ... } public class viewedprofile { ... private linkedhashset<string> viewedby = null; private linkedhashset<string> profilesviewed = null; ... } the methods error:
public void recentlyviewed (string email, string emailvisited) throws persistenceexception{ entitymanager em = emf.get().createentitymanager(); entitytransaction tx = null; profile user = null; try{ tx = em.gettransaction(); tx.begin(); user = em.find(profile.class, email); //nobody viewed profile yet if (user.getviewed() == null){ linkedhashset<string> set = new linkedhashset<string>(); set.add( emailvisited ); viewedprofile view = new viewedprofile(); view.setprofilesviewed( set); user.setviewed( view ); } else if ( user.getviewed().getprofilesviewed().contains( emailvisited ) ){ //remove added bubble user.getviewed().getprofilesviewed().remove( emailvisited ); user.getviewed().getprofilesviewed().add( emailvisited ); } else { user.getviewed().getprofilesviewed().add( emailvisited ); if (user.getviewed().getprofilesviewed().size() > max_visited){ user.getviewed().getprofilesviewed().remove( user.getviewed().getprofilesviewed().iterator().next()); } } tx.commit(); }finally{ try { if (tx != null && tx.isactive()) { tx.rollback(); } } { em.close(); } } } the stacktrace:
uncaught exception servlet javax.persistence.rollbackexception: transaction failed commit @ org.datanucleus.jpa.entitytransactionimpl.commit(entitytransactionimpl.java:118) @ org.datanucleus.store.appengine.jpa.datastoreentitytransactionimpl.commit(datastoreentitytransactionimpl.java:58) @ ...recentlyviewed(detailsaccess.java:356) @ ...randomuser(useraction.java:258) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:45) @ com.opensymphony.xwork2.defaultactioninvocation.invokeaction(defaultactioninvocation.java:453) @ com.opensymphony.xwork2.defaultactioninvocation.invokeactiononly(defaultactioninvocation.java:292) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:255) @ org.apache.struts2.interceptor.debugging.debugginginterceptor.intercept(debugginginterceptor.java:256) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.defaultworkflowinterceptor.dointercept(defaultworkflowinterceptor.java:176) @ com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.validator.validationinterceptor.dointercept(validationinterceptor.java:265) @ org.apache.struts2.interceptor.validation.annotationvalidationinterceptor.dointercept(annotationvalidationinterceptor.java:68) @ com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.conversionerrorinterceptor.intercept(conversionerrorinterceptor.java:138) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:211) @ com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:211) @ com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.staticparametersinterceptor.intercept(staticparametersinterceptor.java:190) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ org.apache.struts2.interceptor.multiselectinterceptor.intercept(multiselectinterceptor.java:75) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ org.apache.struts2.interceptor.checkboxinterceptor.intercept(checkboxinterceptor.java:90) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ org.apache.struts2.interceptor.fileuploadinterceptor.intercept(fileuploadinterceptor.java:243) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.modeldriveninterceptor.intercept(modeldriveninterceptor.java:100) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.scopedmodeldriveninterceptor.intercept(scopedmodeldriveninterceptor.java:141) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.chaininginterceptor.intercept(chaininginterceptor.java:145) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.prepareinterceptor.dointercept(prepareinterceptor.java:171) @ com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.i18ninterceptor.intercept(i18ninterceptor.java:176) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ org.apache.struts2.interceptor.servletconfiginterceptor.intercept(servletconfiginterceptor.java:164) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.aliasinterceptor.intercept(aliasinterceptor.java:192) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ com.opensymphony.xwork2.interceptor.exceptionmappinginterceptor.intercept(exceptionmappinginterceptor.java:187) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ ...logininterceptor.intercept(logininterceptor.java:37) @ com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249) @ org.apache.struts2.impl.strutsactionproxy.execute(strutsactionproxy.java:54) @ org.apache.struts2.dispatcher.dispatcher.serviceaction(dispatcher.java:510) @ org.apache.struts2.dispatcher.ng.executeoperations.executeaction(executeoperations.java:77) @ org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter.dofilter(strutsprepareandexecutefilter.java:91) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler.handle(servlethandler.java:388) @ org.mortbay.jetty.security.securityhandler.handle(securityhandler.java:216) @ org.mortbay.jetty.servlet.sessionhandler.handle(sessionhandler.java:182) @ org.mortbay.jetty.handler.contexthandler.handle(contexthandler.java:765) @ org.mortbay.jetty.webapp.webappcontext.handle(webappcontext.java:418) @ org.mortbay.jetty.handler.handlerwrapper.handle(handlerwrapper.java:152) @ org.mortbay.jetty.server.handle(server.java:326) @ org.mortbay.jetty.httpconnection.handlerequest(httpconnection.java:542) @ org.mortbay.jetty.httpconnection$requesthandler.headercomplete(httpconnection.java:923) @ org.mortbay.jetty.httpconnection.handle(httpconnection.java:404) @ com.google.tracing.tracecontext$tracecontextrunnable.runincontext(tracecontext.java:480) @ com.google.tracing.tracecontext$tracecontextrunnable$1.run(tracecontext.java:487) @ com.google.tracing.tracecontext.runincontext(tracecontext.java:774) @ com.google.tracing.tracecontext$dointracecontext.runincontext(tracecontext.java:751) @ com.google.tracing.tracecontext$abstracttracecontextcallback.runininheritedcontextnounref(tracecontext.java:342) @ com.google.tracing.tracecontext$abstracttracecontextcallback.runininheritedcontext(tracecontext.java:334) @ com.google.tracing.tracecontext$tracecontextrunnable.run(tracecontext.java:484) @ java.lang.thread.run(thread.java:722) caused by: javax.persistence.persistenceexception: transaction rolled due failure during commit @ org.datanucleus.jpa.nucleusjpahelper.getjpaexceptionfornucleusexception(nucleusjpahelper.java:283) @ org.datanucleus.jpa.entitytransactionimpl.commit(entitytransactionimpl.java:116) ... 81 more caused by: javax.transaction.xa.xaexception: concurrent modification @ org.datanucleus.store.appengine.datastorexaresource.commit(datastorexaresource.java:93) @ org.d...(length 9822) i suspect problem linkedhashset, tried in separate project.
public class person { private linkedhashset<string> viewers = null; public linkedhashset<string> getviewers() { return viewers; } public void setviewers(linkedhashset<string> viewers) { this.viewers = viewers; } } then modification of set:
person p = new person(); linkedhashset<string> viewers = new linkedhashset<string>(); viewers.add("one"); viewers.add("two"); viewers.add("three"); viewers.add("four"); p.setviewers(viewers); p.getviewers().remove(p.getviewers().iterator().next()); p.getviewers().remove("two"); p.getviewers().add("two"); (string s: p.getviewers()){ system.out.println(s); } but 1 work. help? thanks
Comments
Post a Comment