【问题标题】:hibernate exception:could not insert collection rowshibernate异常:无法插入集合行
【发布时间】:2012-03-15 10:05:24
【问题描述】:

我正在使用休眠来映射到数据库。 但是遇到如下错误:

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

我的 saveOrUpdate 方法:

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

这是我的 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  -->

这种情况并非一直发生,但有时会发生。 谁能给我一些提示?

【问题讨论】:

  • 如果您的代码是线程化的,这可能就是问题所在。

标签: java database hibernate c3p0


【解决方案1】:

终于解决了问题。这是因为我将 c3p0 max_statements 设置为 50。它只缓存 50。现在我将它设置为 0,这意味着没有缓存。现在我将它设置为 0,它完美运行! 感谢您的帮助。

【讨论】:

    【解决方案2】:
    java.sql.BatchUpdateException: No operations allowed after statement closed
    

    由于 MySQL 在一段时间后关闭连接,您可能遇到了问题。请阅读autoReconnecthere。您应该将autoReconnect=true 添加到您的 JDBC 连接 URI。

    【讨论】:

    • 谢谢!但是我尝试添加autoReconnect=true,还是不行。
    【解决方案3】:

    正如您在跟踪中看到的,它在顶部显示 org.hibernate.exception.JDBCConnectionException。有时,您的数据库连接可能会成为您的问题。如果您确定它不是连接问题,那么您必须启用 showSql 标志以查看更详细的跟踪以找出究竟是什么原因。我希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我很确定这不是连接问题。而且它并非一直发生,非常罕见。我用它很长一段时间用于相同类型的对象,它很好。我将启用 showSql 来查看。感谢您的建议。周末愉快!
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多