问题
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