2013-03-25 3 views
0

Я веб-приложений с использованием Hibernate развернуты в 3 нагрузки сбалансировано TomcatsHincernate автоинкремент в loadbalancing tomcats?

и я часто получаю следующее исключение

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) 
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92) 
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87) 
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224) 
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 com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:181) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) 
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:197) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Вызванный: java.sql.BatchUpdateException: Дублировать запись «145985» для ключа 'ПЕРВИЧНЫЙ' на com.mysql.jdbc.PreparedStatement.executeBatchSerially (PreparedStatement.java:1666) на com.mysql.jdbc.PreparedStatement.executeBatch (PreparedStatement.java:1082) в com.mchange.v2.c3p0.impl .NewProxyPreparedStatement.executeBatch (NewProxyPreparedStatement.java:172 3) в org.hibernate.jdbc.BatchingBatcher.doExecuteBatch (BatchingBatcher.java:48) в org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:246) ... 38 более

И I использовали следующую конфигурацию

@Id 
@GenericGenerator(name = "generator", strategy = "increment") 
@GeneratedValue(generator = "generator") 
@Basic(optional = false) 
@Column(name = "address_id", nullable = false) 
private Long addressId; 

ответ

2

IncrementGenerator не группироваться в безопасности, как описано в источнике. Он работает, считывая максимальное значение id в первый раз и продолжая увеличивать его в памяти. В вашем случае предположим, что в начале максимальное значение равно 10. IncrementGenerator на 3 узлах может считывать значение как 10 и назначать 11 в качестве идентификатора для экземпляров, созданных в каждом узле.

Всегда полагайтесь на механизм генерации идентификатора базы данных, чтобы обеспечить безопасность кластера.

+0

Как убедиться, что db генерирует идентификатор автоматического увеличения в спящем режиме? если мы передаем null, hibernate передает нулевой объект в качестве значения db. – Rocko

+0

Это зависит от вашего db..for oracle см. Http://stackoverflow.com/questions/2384420/how-is-my-id-being-generated-with-jpa-using-hibernate-with-the-oracle-10g -dialec – Adi

+0

Я использую MySQL – Rocko

Смежные вопросы