【发布时间】:2012-01-04 13:13:28
【问题描述】:
我正在使用休眠将对象放入数据库。该数据库是 MYSQL 社区版。 整个更新运行到事务中。
执行它的代码是这样的:
getHibernateTemplate().saveOrUpdate(order);
订单量少时没有问题,但是当我测试了接近 1 000 000 件商品的场景时,我遇到了这个问题:
11-22@12:56:48 DEBUG PersistOrderServiceImpl [flow.ottoImportOrderPlacementInboundFlow.1] - saving order instance::
[Order [orderId=080661, vatOrderNumber=SODE000001, orderDate=Tue Nov 08 10:12:37 CET 2011, shippingMethod=STANDARD, ....
11-22@13:02:12 ERROR JDBCTransaction [flow.ottoImportOrderPlacementInboundFlow.1] - JDBC rollback failed
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
.....
....
11-22@13:02:12 ERROR TransactionInterceptor [flow.ottoImportOrderPlacementInboundFlow.1] - Application exception overridden by rollback exception
java.lang.NullPointerException
at com.mysql.jdbc.Field.setConnection(Field.java:972)
at com.mysql.jdbc.StatementImpl.getGeneratedKeysInternal(StatementImpl.java:1912)
at com.mysql.jdbc.StatementImpl.getGeneratedKeysInternal(StatementImpl.java:1905)
at com.mysql.jdbc.StatementImpl.getGeneratedKeys(StatementImpl.java:1885)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.getGeneratedKeys(NewProxyPreparedStatement.java:1749)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:97)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
......
......
问题似乎在大约 5 分 24 秒或总共 324 秒后出现。
我在 MySQL 日志中找不到任何关于它的信息。
似乎与内存无关,因为当我降低内存时异常不同:
java.lang.OutOfMemoryError: GC overhead limit exceeded
我不知道这是 MySQL 的 Hibernate 中的某种错误,还是限制了更新/连接/事务可以运行的时间的某些设置。
我在 MySQL 文档或 Hibernate 设置中找不到任何相关内容。
对于调试或解决此问题的任何帮助,我将不胜感激。
已解决:问题出在我的 tomcat 库中的文件 c3p0.properties 中。 它包含: c3p0.unreturnedConnectionTimeout=300 这或多或少是我收到错误的时间。删除后更新通过,没问题。
【问题讨论】:
-
所以您正在创建 100 万个 Order 对象并使用休眠模式持久化它们?你能发布休眠保存代码吗?
-
不,我只创建一个包含 100 万件商品的订单。将代码发布到问题中。
标签: mysql performance hibernate jpa transactions