MySQL INSERT прогрессивно медленнее в Ubuntu, но не в Windows - PullRequest
3 голосов
/ 22 ноября 2010

Я пытаюсь вставить 3,6 миллиона записей в MySQL 5.1, используя JPA в Glassfish 3.0.1. Я делаю это одним вызовом бизнес-метода EJB, поэтому я полагаю, что это делается в одной транзакции SQL. Я сумасшедший? : -)

Поскольку используется один и тот же экземпляр EntityManager, бизнес-метод должен вызывать em.flush () и em.clear () каждые 3000 записей, иначе em будет засоряться. (Я пробовал разные значения, мне кажется, это оптимально).

Это прекрасно работает на моей платформе для тестирования и разработки (WinXP на четырехъядерном процессоре). Каждое 100000 em.persist () занимает 24-28 с, а вся операция занимает 15 минут.

Но в нашей производственной коробке с Ubuntu 10 на виртуализированной коробке x86_64 каждый 100000 em.persist () становится все медленнее. Первый занимает 40 с, затем 70, 77, 89, 121, 130, 126, 163, 201, 247 с. Приложение сервера заканчивается полным зависанием.

Mysql: 5.1.47-сообщество MySQL Community Server (GPL) (Windows), 5.1.41-3ubuntu12.6 (Ubuntu)

Я не могу понять, почему (почти) одно и то же программное обеспечение ведет себя так принципиально иначе. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2010

Не пытайтесь зафиксировать 3,6 миллиона записей в одной транзакции.Я думаю, что вы снимаете нагрузку с JVM, выполняя периодические em.flush () и em.clear (), но это не помогает базе данных на другом конце, который должен управлять данными отката для 3,6 млнзаписи, пока вы, наконец, не передадите их.

Вы размещаете базу данных на том же сервере, что и приложение Java?Возможно, узким местом является база данных, а не код Java.Попробуйте проверить использование памяти и ЦП для различных процессов в двух ваших средах.Может быть очевидно, что либо Java, либо сервер базы данных используют всю память или ЦП.

0 голосов
/ 24 ноября 2010

EJB / JPA не дает мне выбора; Контейнер EJB обрабатывает транзакцию и фиксирует ее, когда возвращается бизнес-метод. Возможно, есть способ заставить EJB делать коммит каждый раз, когда бизнес-метод создал 10000 сущностей ...

мог бы сделать это, используя JDBC напрямую, конечно, но это будет тянуть коврик под JPA).

Странно, однако, разница в поведении на двух машинах.

0 голосов
/ 22 ноября 2010

15 минут, это действительно медленно. Вы используете транзакции? Если нет, то ты должен быть. Если вы используете транзакции, как часто вы совершаете транзакции, вы должны делать это достаточно регулярно, но не слишком регулярно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...