Пакетное обновление Hibernate не работает - PullRequest
0 голосов
/ 01 января 2012

я хочу использовать hibernate пакетное обновление , я попробовал пакетную вставку , и она работает нормально, вот конфигурация , которую я использую для гибернации:

<property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.hbm2ddl.auto=update
                hibernate.show_sql=false
                hibernate.jdbc.fetch_size=100
                hibernate.jdbc.batch_size=100
                hibernate.jdbc.batch_versioned_data=true
                hibernate.order_inserts=true
                hibernate.order_updates=true
                hibernate.cache.use_query_cache=false
                hibernate.cache.use_second_level_cache=false

            </value>
        </property>

и вот код DAO :

public void updateBulkEmployees(List<Employee> employees) throws Exception {

        for (int i = 0; i < employees.size(); i++) {
            sessionFactory.getCurrentSession().update(employees.get(i));
            if (i % 100 == 0) {
                sessionFactory.getCurrentSession().flush();
                sessionFactory.getCurrentSession().clear();
                log.debug("Flushing batch:" + (int) (i / 100));
            }            

        }

            sessionFactory.getCurrentSession().flush();
            sessionFactory.getCurrentSession().clear();

    }

ВЫПУСК : я могу заметить, что выполнение метода занимает так много времени (точно так жевремя, затраченное без использования пакетной обработки), поэтому пакетное обновление не работает, я что-то упустил в конфигурации или что-то не так?пожалуйста, посоветуйте, спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2012

Откуда вы знаете, что пакетная вставка работает?Наблюдайте, что mysql.log - единственный способ узнать, работает ли пакетная вставка / обновление или нет (Hibernate всегда регистрирует один запрос, даже если используется пакетная обработка).

Чтобы использовать пакетную обработку с MySQL, необходимо установить конкретный JDBCПараметр в вашем URL (пакет Hibernate использует функцию пакета JDBC).Попробуйте:

http://your_host:your_port/database?rewriteBatchedStatements=true

И не используйте GenerationType.AUTO или GenerationType.IDENTITY в качестве генератора идентификаторов.В этом случае отключите функцию пакетного режима без вывода сообщений.

Советы: Промежуточная очистка требуется только для того, чтобы избежать OutOfMemory.Hibernate пытается выполнить запрос к базе данных как можно дольше, поэтому, если вы попытаетесь обновить 1000000 сущностей, она сохранит все сущности в памяти до фиксации.

0 голосов
/ 01 января 2012

Не должен второй "sessionFactory.getCurrentSession (). Flush ();"быть вне цикла?

...