[RESOLVIDO] Lock otimista JPA

20 respostas
S

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

20 Respostas

H

Por que você precisa na hora de salvar? O.o

S

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.

H

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.

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?

S

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!

H

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!
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.

C

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?

S

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);
          }
       }
    }
H

É 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í?

S

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
H

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!

S

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.

H

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.

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. [=

S

jakefrog:
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.

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. [=

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!

R

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?

S

Entendi vou tentar isso aqui e ja posto a resposta

Obrigado

C

also, seria bom se o o objeto getTgrSequencialtabelasBean() fosse final.

S

Obrigado a JakeFrog e a todos que participaram desse tópico, declarando o metodo como synchronized resolveu o meu problema ficou perfeito.

Valw :lol:

S

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

G

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
}
S

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
}

Oi gomesrod obrigado pela atenção kra, entendi a sua idéia eu vou passar somente uma vez no “gerador de ids” mas ja carregando todos os Ids que preciso para persistir naquele momento e so acessando novamente o metodo na proxima lista que necessito persistir. acho que vai melhorar o desempenho sim!
Vou implementar isso e posto o resultado
Obrigado

Resolvido kra ótima idéia ficou totalmente funcional e a performance aumento muito!!!
RESOLVIDO

Obrigado a todos!

Criado 20 de agosto de 2012
Ultima resposta 14 de fev. de 2013
Respostas 20
Participantes 5