【问题标题】:MySQL INSERTs progressively slower on Ubuntu, but not on WindowsMySQL INSERT 在 Ubuntu 上逐渐变慢,但在 Windows 上没有
【发布时间】:2010-11-22 10:53:36
【问题描述】:

我尝试在 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-community MySQL 社区服务器 (GPL) (Windows), 5.1.41-3ubuntu12.6 (Ubuntu)

我不明白为什么(几乎)相同的软件会表现出如此根本的不同。有什么想法吗?

【问题讨论】:

    标签: mysql jpa


    【解决方案1】:

    15 分钟,真的很慢。你在使用交易吗?如果不是,你应该是。如果您正在使用事务,您提交的频率是多少,您应该相当定期地提交,但不要太频繁。

    【讨论】:

      【解决方案2】:

      不要尝试在单个事务中提交 360 万条记录。我认为您通过执行定期 em.flush() 和 em.clear() 来减轻 JVM 的负载,但这无助于另一端的数据库,后者必须管理 360 万个新的回滚数据记录,直到您最终提交它们。

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

      【讨论】:

        【解决方案3】:

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

        (当然,我可以直接使用 JDBC 来做到这一点,但这将在 JPA 下拉扯地毯)。

        不过,奇怪的是两台机器的行为不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多