0
votes

My application contains several threads running concurrently and all threads either inserts or updates several rows in my tables, So I am using saveOrUpdate() to avoid duplicate entry issue. But it happens several times.

My Table structure

CREATE TABLE `question` (`id` varchar(100) CHARACTER SET latin1 NOT NULL COMMENT 'It will be the post_id in )

My HBM

<class name="com.xminds.bestfriend.frontend.model.Question" table="question" >
    <id name="id" type="string">
        <column name="id" length="100" />
        <generator class="assigned" />
    </id>
    <many-to-one name="users" class="com.xminds.bestfriend.frontend.model.Users" fetch="select">
        <column name="answer_uid" />
    </many-to-one>
    <many-to-one name="questionType" class="com.xminds.bestfriend.frontend.model.QuestionType" fetch="select">

        <column name="question_type_id" />
    </many-to-one>
    <property name="data1" type="string">
        <column name="data1" length="65535" />
    </property>
    <property name="data2" type="string">
        <column name="data2" length="65535" />
    </property>
    <property name="fbCreatedDate" type="timestamp">
        <column name="fb_created_date" length="19" />
    </property>
    <property name="permaLink" type="string">
        <column name="perma_link" length="1000" />
    </property>
    <property name="fbUpdatedDate" type="timestamp">
        <column name="fb_updated_date" length="19" />
    </property>
    <property name="contentActivity" type="java.lang.Integer">
        <column name="content_activity" />
    </property>
    <property name="nbConsumptions" type="int">
        <column name="nb_consumptions" not-null="true" />
    </property>
    <property name="createdDate" type="date">
        <column name="created_date" length="10" />
    </property>
    <property name="updatedDate" type="date">
        <column name="updated_date" length="10" />
    </property>
    <property name="cover_url" type="string">
      <column name="cover_url" length="1000"/>
    </property>

    <property name="category" type="string">
      <column name="category" length="1000"/>
    </property>
    <property name="width" type="int">
        <column name="width" not-null="true" />
    </property>
    <property name="height" type="int">
        <column name="height" not-null="true" />
    </property>
    <property name="coverOffsetX" type="java.lang.Integer">
        <column name="cover_offset_x" />
    </property>
    <property name="coverOffsetY" type="java.lang.Integer">
        <column name="cover_offset_y" />
    </property>
    <property name="latitude" type="java.lang.Double">
        <column name="latitude" precision="12" scale="0" />
    </property>
    <property name="longitude" type="java.lang.Double">
        <column name="longitude" precision="12" scale="0" />
    </property>
    <property name="is_active" type="boolean">
        <column name="is_active" not-null="true" />
    </property>
    <set name="questionConsumptions" inverse="true">
        <key>
            <column name="question_id" length="100" not-null="true">
                <comment>QuestionId</comment>
            </column>
        </key>
        <one-to-many class="com.xminds.bestfriend.frontend.model.QuestionConsumption" />
    </set>
</class>

getting exception

WARN  JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000

ERROR JDBCExceptionReporter - Duplicate entry '1019306207_10200395396740374' for key 'PRIMARY' ERROR AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not insert: [com.xminds.bestfriend.frontend.model.Question] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2436) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) at com.xminds.bestfriend.consumers.Base.onMessage(Base.java:89) at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:339) at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:535) at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:495) at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947) at java.lang.Thread.run(Thread.java:679) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1019306207_10200395396740374' for key 'PRIMARY' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:532) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2416) ... 25 more ERROR QuestionGeneration - Unable to process task ID : 208 org.springframework.dao.DataIntegrityViolationException: could not insert: [com.xminds.bestfriend.frontend.model.Question]; SQL [insert into question (answer_uid, question_type_id, data1, data2, fb_created_date, perma_link, fb_updated_date, content_activity, nb_consumptions, created_date, updated_date, cover_url, category, width, height, cover_offset_x, cover_offset_y, latitude, longitude, is_active, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.xminds.bestfriend.frontend.model.Question] at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637) at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) at com.xminds.bestfriend.consumers.Base.onMessage(Base.java:89) at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:339) at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:535) at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:495) at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947) at java.lang.Thread.run(Thread.java:679) Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.xminds.bestfriend.frontend.model.Question] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2436) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) ... 14 more Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1019306207_10200395396740374' for key 'PRIMARY' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:532) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2416) ... 25 more

@Override
public void saveOrUpdate(Object instance)
{

    //log.debug("attaching dirty  instance");
    try
    {
        getHibernateTemplate().saveOrUpdate(instance);
        //log.debug("attach successful");
    }
    catch (RuntimeException re)
    {
       // log.error("attach failed", re);
        throw re;
    }

}
2
Something wrong with your transactions then?Kayaman
What versino of hibernate you're using? Show us your HibernateUtil or sessionhandler.Makky
I don't see how saveOrUpdate() could help avoiding duplicates If the entity has an ID, it will be updated. If it doesn't have one it will be inserted. Without seeing the code, it's hard to tell what can be wrong.JB Nizet
Here, In my case, id(primary key) is not auto-incremented and every time I will set its value.. But sometimes I am getting exception WARN JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000 ERROR JDBCExceptionReporter - Duplicate entry '1291270524_10200228165008751' for key 'PRIMARY' ERROR AbstractFlushingEventListener - Could not synchronize database state with sessionArun Mohan
Hibernate version : 3.6.0.FinalArun Mohan

2 Answers

0
votes

You said,"My application contains several threads running concurrently and all threads either inserts or updates several rows in my tables". And you are setting your ID manually. I want to know, the ID which you are setting to your threads, how are you getting them ?

0
votes

You said 'In my case, id(primary key) is not auto-incremented and every time I will set its value'. This is the problem. You should make sure the generated id by yourself should be unique, during multiple threads.

There is 2 ways, 1, using auto-incremented column.
2, using something like UUID to create id. If you just using one jvm, with multiple threads, there is many ways or libs to help you to do that.