MySQL INSERT在Ubuntu上逐渐变慢,但在Windows上却没有

时间:2010-11-22 10:53:36

标签: mysql jpa

我尝试在Glassfish 3.0.1中使用JPA在MySQL 5.1中插入360万条记录。我在一个EJB业务方法调用中完成它,所以我相信它是在一个单独的SQL事务中完成的。我疯了吗? : - )

由于使用了相同的EntityManager实例,因此业务方法必须每3000个记录调用em.flush()和em.clear(),否则em将阻塞。 (我尝试了各种各样的值,这对我来说似乎是最佳的。)

这在我的测试和开发平台(四核盒子上的WinXP)上非常有效。每个100000 em.persist()需要24-28秒,整个操作需要15分钟。

但是在我们的生产盒上,在虚拟化的x86_64盒子上使用Ubuntu 10,每个100000 em.persist()逐渐变慢。第一个需要40秒,然后是70,77,89,121,130,126,163,201,247秒。服务器应用程序最终会挂起。

MySQL的: 5.1.47社区MySQL社区服务器(GPL)(Windows), 5.1.41-3ubuntu12.6(Ubuntu)

我无法弄清楚为什么(几乎)相同的软件表现得如此根本不同。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

15分钟,这真的很慢。你在使用交易吗?如果不是,你应该是。如果你正在使用交易,你多久提交一次,你应该定期,但不要太经常。

答案 1 :(得分:0)

不要尝试在一次交易中提交360万条记录。我认为你通过执行定期的em.flush()和em.clear()来减轻JVM的负担,但这对于另一端需要管理360万新回滚数据的数据库没有帮助记录,直到你最终提交它们。

您是否在与Java应用程序相同的服务器上托管数据库?也许数据库是瓶颈而不是Java代码。尝试检查两个环境中各种进程的内存和CPU使用情况。很明显,Java或数据库服务器正在耗尽所有内存或CPU。

答案 2 :(得分:0)

EJB / JPA没有(afaik)给我一个选择; EJB容器处理事务并在业务方法返回时提交它。也许有一种方法可以告诉EJB每次业务方法创建10000个实体时都要提交......

(当然,我可以直接使用JDBC来做到这一点,但这样做会在JPA下发挥作用。)

但奇怪的是,这两台机器的行为有所不同。