EclipseLink очень медленно вставляет данные - PullRequest
2 голосов
/ 21 июня 2011

Я использую последнюю версию EclipseLink с MySQL 5.5 (тип таблицы InnoDB).Я вставляю около 30900 записей (что может быть и больше) за раз.Проблема в том, что производительность вставки довольно низкая: для вставки всех записей требуется около 22 секунд (по сравнению с JDBC: 7 секунд).Я читал, что использование пакетной записи должно помочь - но не так!?

@Entity
public class TestRecord {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    public int test;
}

Код для вставки записей:

factory = Persistence.createEntityManagerFactory("xx_test");
EntityManager em = factory.createEntityManager();

em.getTransaction().begin();

for(int i = 0; i < 30900; i++) {
    TestRecord record = new TestRecord();
    record.test = 21;
    em.persist(record);
}

em.getTransaction().commit();
em.close();

И, наконец, моя конфигурация EclipseLink:

<persistence-unit name="xx_test" transaction-type="RESOURCE_LOCAL">
    <class>com.test.TestRecord</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/xx_test" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="test" />

        <property name="eclipselink.jdbc.batch-writing" value="JDBC" />
        <property name="eclipselink.jdbc.cache-statements" value="true"/>   

        <property name="eclipselink.ddl-generation.output-mode" value="both" />
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />

        <property name="eclipselink.logging.level" value="INFO" />
    </properties>
</persistence-unit>

Что я делаю не так?Я пробовал несколько настроек, но ничего не помогает.Заранее спасибо за помощь!:)

-Stefan


Другое дело - добавить ?rewriteBatchedStatements=true к URL-адресу данных, используемому соединителем.

Это вызвало выполнение около 120300 вставок дооколо 30-х годов, которые были около 60-х годов раньше.

Ответы [ 3 ]

6 голосов
/ 20 июня 2012

Пакетная запись JDBC резко повышает производительность;пожалуйста, попробуйте

Например: property name="eclipselink.jdbc.batch-writing" value="JDBC"

5 голосов
/ 23 июня 2011
@GeneratedValue(strategy = GenerationType.IDENTITY)

Переключение на последовательность таблиц, IDENTITY никогда не рекомендуется и серьезная проблема с производительностью.

См, http://java -persistence-performance.blogspot.com / 2011/06 / как к улучшению, JPA-производительность-на-1825.html

Кажется, я помню, что MySQL может не поддерживать пакетную запись без какой-либо конфигурации базы данных, на эту тему был еще один пост, я забыл URL, но вы, вероятно, могли бы его найти.

0 голосов
/ 21 июня 2011

Вероятно, самая большая разница, кроме преобразования карт, - это кэширование.По умолчанию EclipseLink помещает каждую из сущностей в постоянный контекст (EntityManager), а затем во время завершения фиксации необходимо добавить их все в кеш.

Сейчас нужно попробовать одну вещь:

  1. измеряет, сколько времени занимает вызов em.flush () после цикла, но до фиксации.Затем, если хотите, вы можете вызвать em.clear () после сброса, чтобы вновь вставленные сущности не были объединены в кеш.

Doug

...