2011-11-23 91 views
0

我正在使用hibernate将对象放入数据库。 DB是MYSQL社区版。 整个更新运行到事务中。数据库更新 - 长时间运行操作失败

,做它是这样做的代码:

getHibernateTemplate()saveOrUpdate(顺序);

有没有问题,当订单虽小,但是当我测试了密切的情况下,以1个000 000项目我就遇到了这个问题:

[email protected]: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, .... 

[email protected]: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) 
..... 
.... 
[email protected]: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的休眠某种错误的,或者是一些设置限制了更新/连接/事务可以运行的时间。

我在MySQL文档或Hibernate设置中找不到任何相关内容。

我希望有任何帮助调试或解决此问题。

已解决:问题出在我的tomcat lib中的文件c3p0.properties中。它包含:c3p0.unreturnedConnectionTimeout = 300或多或少的时间后,我得到的错误。我删除它后更新通过,没有问题。

+0

所以你正在创建1mil的订单对象,并坚持使用休眠?你可以发布休眠保存代码吗? –

+0

不,我正在用1密尔的物品创造一个订单。将代码发布到该问题。 –

回答

2

数据库连接池配置了超时值。一旦事务已经开始(从池中借用一个连接),并且在超时值之前没有完成(不释放与池的连接),则连接将由数据库连接池(标记为废弃)关闭。当hibernate尝试提交事务时(请注意,hibernate无法知道连接是否已经关闭),驱动程序会发生异常。尝试将您的交易细分为更小的交易(批量提交项目)。一旦所有订单已经插入到数据库中,请插入您的订单对象。但是,您的应用程序代码应负责批量提交失败以及此后的回滚逻辑。

+0

我想我找到了原因 - 它在我的tomcat lib中的文件c3p0.properties中。它包含:c3p0.unreturnedConnectionTimeout = 300这或多或少是我得到这个错误后的时间。 –

+0

我删除文件后,问题不再存在。所以你是对的,这是合并问题。谢谢! –

+0

您应该小心,因为删除超时条目可能会导致一些不良影响。在调用这个永久性修复程序之前,请阅读您正在使用的驱动程序和连接池的文档。 –