Bom dia,
O Lock otimista do JPA funciona somente no momento de atualizar algum registro no banco ou também consegue resolver no momento de salvar um registro novo?
Obrigado
Bom dia,
O Lock otimista do JPA funciona somente no momento de atualizar algum registro no banco ou também consegue resolver no momento de salvar um registro novo?
Obrigado
Por que você precisa na hora de salvar? O.o
Olá JakeFrog
Então eu preciso no momento do save, pois estou com o seguinte problema: Se usuários diferentes coincidirem de chamar o mesmo método em questão ( gravar novos registros ) estou tomando dead lock ou então erro de concurrency update.
[quote=sciuba]Olá JakeFrog
Então eu preciso no momento do save, pois estou com o seguinte problema: Se usuários diferentes coincidirem de chamar o mesmo método em questão ( gravar novos registros ) estou tomando dead lock ou então erro de concurrency update.[/quote]O lock ele serve para na hora de atualizar um registro, ele travar a linha/tabela e atualizar o necessário. Um registro novo não teria esse problema, pois ele não existe ainda.
Você tem certeza que o problema está na hora de persistir?
Tenho certeza sim! o problema ocorre no momento de persistir, como este método grava uma lista de novos registros creio que a concorrencia esteja gerando estes problemas!? e estava tentando de alguma forma achar uma solução que consiga travar este metodo para ter um acesso de uma requisição por vez!
[quote=sciuba]Tenho certeza sim! o problema ocorre no momento de persistir, como este método grava uma lista de novos registros creio que a concorrencia esteja gerando estes problemas!? e estava tentando de alguma forma achar uma solução que consiga travar este metodo para ter um acesso de uma requisição por vez! [/quote]Seu sistema é Web ou Desktop? Se for Desktop teria que rolar um bloqueio na unha por parte do seu sistema. Se for web, eu nunca vi isso para Web não.
Isso não parece ser problema de JPA.
Como não vi seu código, vou CHUTAR que o seu código não é thread-safe.
Tem certeza que o erro de concorrencia é do JPA, e não um ConcurrentModificationException da lista de objetos que você está tentando salvar?
O meu sistema é WEB ( JSF ) e estamos passando de um sistema Delphi para Java
Vou postar o código:
public void _Insert(
String sGuid,
List<AcdTurmaAluno> alunoTurma,
Long lPlanoaulaDiscip,
Long lPlanoaualData) throws Exception {
AcdPlanoaulaApontamento novoApont = new AcdPlanoaulaApontamento();
AcdPlanoaulaApontamentoPK novoApontPK = new AcdPlanoaulaApontamentoPK();
preparedStatement.execute();
for (AcdTurmaAluno aluno : alunoTurma) {
if (verificaApontamento(sGuid, aluno, lPlanoaulaDiscip, lPlanoaualData)) {
novoApontPK.setIdAcdPlanoaulaApontamento(getTgrSequencialtabelasBean().getNextID(sGuid, "ACD_PLANOAULA_APONTAMENTO"));
novoApont.setAcdPlanoaulaApontamentoPK(novoApontPK);
novoApont.setIdPlanoaulaDispensa(null);
novoApont.setIdPlanoaulaData(null);
novoApont.setIdTurmaAluno(aluno.getAcdTurmaAlunoPK().getIdAcdTurmaAluno());
novoApont.setFgPresenca("N");
novoApont.setFgPontualidade("S");
novoApont.setSiglaParticipacao(null);
novoApont.setDescComentario(null);
novoApont.setDtCadastro(null);
novoApont.setDtAlteracao(null);
novoApont.setIdUsuarioCad(null);
novoApont.setIdUsuarioAlt(null);
novoApont.setIdPlanoaulaDiscip(lPlanoaulaDiscip);
novoApont.setIdAlunoRespons(null);
novoApont.setIdTgrEvento(null);
getAcdPlanoaulaApontamentoBean().inserir(novoApont);
}
}
}
É cara, já deu para ver que seu código ta tenso. O ID gerado na unha né?
Você tem o stacktrace completo do erro de lock aí?
Então o erro varia um pouco acabei de simular a situação segue o stack trace do erro:
Informações: [wpos_16.4] 20/08/12 14:03 WARN [http-thread-pool-8080(2)] (JDBCExceptionReporter.java:77) - SQL Error: 335544665, SQLState: HY000
Informações: [wpos_16.4] 20/08/12 14:03 ERROR [http-thread-pool-8080(2)] (JDBCExceptionReporter.java:78) - GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "PK_45" on table "ACD_PLANOAULA_APONTAMENTO"
Informações: [wpos_16.4] 20/08/12 14:03 ERROR [http-thread-pool-8080(2)] (AbstractFlushingEventListener.java:301) - Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [br.com.advpos.entities.AcdPlanoaulaApontamento]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304)
at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:346)
at $Proxy340.flush(Unknown Source)
at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:193)
at $Proxy249.flush(Unknown Source)
at br.com.advpos.dao.ADGenericDaoImp.save(ADGenericDaoImp.java:53)
at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy250.save(Unknown Source)
at br.com.advpos.bean.AcdPlanoaulaApontamentoBean.inserir(AcdPlanoaulaApontamentoBean.java:44)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._Insert(adApontamentoPresencaConteudo.java:878)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamento(adApontamentoPresencaConteudo.java:653)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamentoPorDisciplina(adApontamentoPresencaConteudo.java:702)
at br.com.advpos.adframework.adApontamentoPresencaConteudo.InserirPlanoAulaApontamento(adApontamentoPresencaConteudo.java:945)
at br.com.advpos.adframework.adApontamentoPresencaConteudo$$FastClassByCGLIB$$e77f5342.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:624)
at br.com.advpos.adframework.adApontamentoPresencaConteudo$$EnhancerByCGLIB$$c492c743.InserirPlanoAulaApontamento(<generated>)
at wpos.controle.pedagogico.CentralApontamentoPresenca.actSelecionaData(CentralApontamentoPresenca.java:991)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:144)
at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:302)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)
at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroJSF.doFilter(FiltroJSF.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroPedagogico.doFilter(FiltroPedagogico.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroAuthenticUserMaster.doFilter(FiltroAuthenticUserMaster.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.ca
Informações: talina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "PK_45" on table "ACD_PLANOAULA_APONTAMENTO"
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:190)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
... 106 more
Grave: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert: [br.com.advpos.entities.AcdPlanoaulaApontamento]
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:307)
at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:346)
at $Proxy340.flush(Unknown Source)
at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:193)
at $Proxy249.flush(Unknown Source)
at br.com.advpos.dao.ADGenericDaoImp.save(ADGenericDaoImp.java:53)
at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy250.save(Unknown Source)
at br.com.advpos.bean.AcdPlanoaulaApontamentoBean.inserir(AcdPlanoaulaApontamentoBean.java:44)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._Insert(adApontamentoPresencaConteudo.java:878)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamento(adApontamentoPresencaConteudo.java:653)
at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamentoPorDisciplina(adApontamentoPresencaConteudo.java:702)
at br.com.advpos.adframework.adApontamentoPresencaConteudo.InserirPlanoAulaApontamento(adApontamentoPresencaConteudo.java:945)
at br.com.advpos.adframework.adApontamentoPresencaConteudo$$FastClassByCGLIB$$e77f5342.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:624)
at br.com.advpos.adframework.adApontamentoPresencaConteudo$$EnhancerByCGLIB$$c492c743.InserirPlanoAulaApontamento(<generated>)
at wpos.controle.pedagogico.CentralApontamentoPresenca.actSelecionaData(CentralApontamentoPresenca.java:991)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:144)
at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:302)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)
at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroJSF.doFilter(FiltroJSF.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroPedagogico.doFilter(FiltroPedagogico.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at wpos.controle.filtros.FiltroAuthenticUserMaster.doFilter(FiltroAuthenticUserMaster.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain
Grave: .java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [br.com.advpos.entities.AcdPlanoaulaApontamento]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304)
... 97 more
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "PK_45" on table "ACD_PLANOAULA_APONTAMENTO"
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:190)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
... 106 more
Grave: at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)
Grave: at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:307)
Grave: at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
Grave: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Grave: at java.lang.reflect.Method.invoke(Method.java:601)
Grave: at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:346)
Grave: at $Proxy340.flush(Unknown Source)
Grave: at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source)
Grave: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Grave: at java.lang.reflect.Method.invoke(Method.java:601)
Grave: at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:193)
Grave: at $Proxy249.flush(Unknown Source)
Grave: at br.com.advpos.dao.ADGenericDaoImp.save(ADGenericDaoImp.java:53)
Grave: at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source)
Grave: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Grave: at java.lang.reflect.Method.invoke(Method.java:601)
Grave: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
Grave: at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
Grave: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
Grave: at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
Grave: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
Grave: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
Grave: at $Proxy250.save(Unknown Source)
Grave: at br.com.advpos.bean.AcdPlanoaulaApontamentoBean.inserir(AcdPlanoaulaApontamentoBean.java:44)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo._Insert(adApontamentoPresencaConteudo.java:878)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamento(adApontamentoPresencaConteudo.java:653)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo._InsereApontamentoPorDisciplina(adApontamentoPresencaConteudo.java:702)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo.InserirPlanoAulaApontamento(adApontamentoPresencaConteudo.java:945)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo$$FastClassByCGLIB$$e77f5342.invoke(<generated>)
Grave: at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
Grave: at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:624)
Grave: at br.com.advpos.adframework.adApontamentoPresencaConteudo$$EnhancerByCGLIB$$c492c743.InserirPlanoAulaApontamento(<generated>)
Grave: at wpos.controle.pedagogico.CentralApontamentoPresenca.actSelecionaData(CentralApontamentoPresenca.java:991)
Grave: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Grave: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Grave: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Grave: at java.lang.reflect.Method.invoke(Method.java:601)
Grave: at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
Grave: at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
Grave: at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:144)
Grave: at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134)
Grave: at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
Grave: at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
Grave: at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:302)
Grave: at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)
Grave: at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
Grave: at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
Grave: at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
Grave: at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
Grave: at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
Grave: at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
Grave: at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
Grave: at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
Grave: at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at wpos.controle.filtros.FiltroJSF.doFilter(FiltroJSF.java:75)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
Grave: at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at wpos.controle.filtros.FiltroPedagogico.doFilter(FiltroPedagogico.java:58)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at wpos.controle.filtros.FiltroAuthenticUserMaster.doFilter(FiltroAuthenticUserMaster.java:67)
Grave: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
Grave: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
Grave: at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
Grave: at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
Grave: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
Grave: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
Grave: at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
Grave: at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
Grave: at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
Grave: at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
Grave: at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
Grave: at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
Grave: at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
Grave: at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
Grave: at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
Grave: at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
Grave: at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
Grave: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
Grave: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
Grave: at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
Grave: at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
Grave: at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
Grave: at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
Grave: at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
Grave: at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
Grave: at java.lang.Thread.run(Thread.java:722)
Grave: Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [br.com.advpos.entities.AcdPlanoaulaApontamento]
Grave: at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
Grave: at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
Grave: at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
Grave: at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
Grave: at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
Grave: at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
Grave: at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
Grave: at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
Grave: at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
Grave: at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
Grave: at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
Grave: at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
Grave: at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304)
Grave: ... 97 more
Grave: Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "PK_45" on table "ACD_PLANOAULA_APONTAMENTO"
Grave: at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
Grave: at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:190)
Grave: at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
Grave: at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
Grave: at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
Grave: ... 106 more
Cara, você tem que sincronizar na unha o método que gera o ID viu.
Ele é gerado na unha certo?
Eu creio que o problema está aí. Dois usuários estão pegando o mesmo ID e tentando inserir o mesmo ID para a mesma Entity!
sim ele é gerado na unha é o retorno de um select
também acho que o problema seja esse! Você por acaso tem alguma idéia de como posso resolver isso!? O Porém é que tenho de continuar seguindo na unha a geração da PK.
Obrigado pela atenção.
[quote=sciuba]sim ele é gerado na unha é o retorno de um select
também acho que o problema seja esse! Você por acaso tem alguma idéia de como posso resolver isso!? O Porém é que tenho de continuar seguindo na unha a geração da PK.
Obrigado pela atenção.[/quote]Ou você faz o método que pega o ID synchronized com uma transação independente, ou você faz o método que persiste a informação synchronized.
Assim, apenas uma pessoa irá buscar as informações. [=
[quote=jakefrog][quote=sciuba]sim ele é gerado na unha é o retorno de um select
também acho que o problema seja esse! Você por acaso tem alguma idéia de como posso resolver isso!? O Porém é que tenho de continuar seguindo na unha a geração da PK.
Obrigado pela atenção.[/quote]Ou você faz o método que pega o ID synchronized com uma transação independente, ou você faz o método que persiste a informação synchronized.
Assim, apenas uma pessoa irá buscar as informações. [=[/quote]
JakeFrog, você poderia exemplificar isso? me desculpe a ignorância mas não consegui imaginar! um detalhe eu uso o Spring MVC também.
Obrigado Novamente!
Um método marcado como synchronized, é um método que não pode ser executado de maneira concorrente, ou seja, duas threads não pode executar o mesmo método ao mesmo tempo, uma terá que esperar enquanto a outra está executando o método.
portanto se você marcar o seu método que pega o id como synchronized, ele nunca será executado de maneira concorrente, portanto teoricamente (vai depender da implementação) dois clients não pegariam o mesmo id.
entendeu?
Entendi vou tentar isso aqui e ja posto a resposta
Obrigado
also, seria bom se o o objeto getTgrSequencialtabelasBean() fosse final.
Obrigado a JakeFrog e a todos que participaram desse tópico, declarando o metodo como synchronized resolveu o meu problema ficou perfeito.
Valw :lol:
Olá a todos,
Retomei este tópico pois surgiu um novo problema referente a este processo que obtive a ajuda de vocês.
Conforme o histórico do tópico declarando o método como synchronized funciona, porém perco performance e desempenho.
Existe algo ou alguém tem alguma idéia de como resolver este caso:
Removi a declaração syncrhonized e tentei utilizar uma trigger no banco para fazer o select na tabela que gerencia os ids somar mais 1 a esse id e fazer o update nesta mesma tabela assim devolvendo o id para a entidade que quero persistir. Isso funciona legal ate 4 acessos passou disso volto a mesmo problema de concurrency update, Ids duplicados, etc, etc.
Da forma que esta (vide histórico do tópico ) existe algum meio de garantir a integridade sem utilizar o método synchronized?
Obs: Não posso alterar o modelo de dados, utilizamos o banco firebird 1.5
Obrigado mais uma vez
Abraços
Você pode usar a estratégia de alocar um lote de IDs , para passar menos vezes pelo método de geração de ID que ficou engargalado após o synchronized. (também vai melhorar o desempenho como um todo, pois serão menos consultas).
Mais ou menos assim:
Você tem isso:
for(... : colecao) {
...
// Para cada item da coleção pega um novo ID "x" . O método getNextID() então atualiza seus controles para que na próxima chamada retorne x+1
novoApontPK.setIdAcdPlanoaulaApontamento(getTgrSequencialtabelasBean().getNextID(sGuid, "ACD_PLANOAULA_APONTAMENTO"));
}
Dá para fazer:
// O método getNextID() foi modificado para receber a quantidade de elementos que será inserida. Ele reservará uma faixa de IDs,
// de modo que na próxima chamada não será retornado "x+1" e sim "x + quantidade reservada" .
// Assim o método synchronized será chamado apenas uma vez para todos os itens.
int id = getTgrSequencialtabelasBean().getNextID(sGuid, "ACD_PLANOAULA_APONTAMENTO", colecao.size())
for(... : colecao) {
...
// Para cada item da coleção pega um novo ID "x" . O método getNextID() então atualiza seus controles para que na próxima chamada retorne x+1
novoApontPK.setIdAcdPlanoaulaApontamento(id);
id++; // Incrementa o ID para o próximo valor
}