hibernate exception:could not insert collection rows

 ̄綄美尐妖づ 提交于 2019-12-12 01:56:28

问题


I am using hibernate to do mapping to database. But encountered the following error:

A exec job config finished.
org.hibernate.exception.JDBCConnectionException: could not insert collection rows: [com.myCompany.jobsrc.ExecJob.subRunningIDs#1]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1454)
at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:86)
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:187)
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 com.myCompany.jobsrc.BasicDaoImpl.saveOrUpdate(BasicDaoImpl.java:38)
at com.myCompany.jobBatch.ExecJobRoutine.generateExecJob(ExecJobRoutine.java:100)
at com.com.myCompany.jobBatch.MarkerRoutine.execute(MarkerRoutine.java:33)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: java.sql.BatchUpdateException: No operations allowed after statement closed.
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:56)
at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1427)
... 14 more

My method of saveOrUpdate:

public void saveOrUpdate(T t){
    Session session = HibernateUtil.getSession();
    Transaction transaction = session.beginTransaction();
    session.saveOrUpdate(t);
    transaction.commit();
}

This is my hibernate.cfg.xml:

  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  <property name="hibernate.connection.password">eboxroot</property>
  <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306  /jobtest?autoReconnect=true</property>
  <property name="hibernate.connection.username">root</property>
 <property name="hibernate.hbm2ddl.auto">update</property>
 <property name="hibernate.cache.use_second_level_cache">false</property>
  <property name="hibernate.cache.use_query_cache">false</property>
 <property name="hibernate.connection.autoReconnect">true</property>
<property    name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
 <property name="c3p0.min_size">5</property>
 <property name="c3p0.max_size">30</property>
 <property name="c3p0.time_out">1800</property>
 <!--property name="c3p0.max_statement">50</property-->
<property name="c3p0.acquire_increment">5</property>
<property name="c3p0.idle_test_period">10</property>
<property name="c3p0.preferredTestQuery">select 1;</property>
<property name="c3p0.debugUnreturnedConnectionStackTraces">true</property>
<property name="hibernate.connection.autoReconnectForPools">true</property>
<!--property name="show_sql">true</property  -->

This is not happening all the time, but like sometimes. Could anyone please give me some hint?


回答1:


As you can see in ur trace, it says org.hibernate.exception.JDBCConnectionException on the top. Once in a while it is possible your database connection could be an issue in your case. If you determine its not connection issue, then you got to enable showSql flag to see more detailed trace to find out what exactly is the reason. I hope that helps.




回答2:


java.sql.BatchUpdateException: No operations allowed after statement closed

You're probably hitting the problem due to MySQL closing connections after some time. Please read about autoReconnect here. You should add autoReconnect=true to your JDBC connection URI.




回答3:


Finally get the problem solved. It was because I set c3p0 max_statements to 50. It caches only 50. Now I set it to 0 which means no cache. Now I set it to 0, it works perfect! Thanks for the help.



来源:https://stackoverflow.com/questions/9439513/hibernate-exception-could-not-insert-collection-rows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!