Пакетные вставки данных Spring

Я пытался включить пакетные вставки с помощью Spring Boots JPA с базой данных MySQL.

В моем application.properties:

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.datasource.url=jdbc:mysql://localhost:3306/demo?reconnect=true&rewriteBatchedStatements=true
spring.jpa.hibernate.jdbc.batch_size=500
spring.jpa.hibernate.order_inserts=true
spring.datasource.username=demo_user
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Я пытался использовать как CrudRepository.save(Iterable s), так и пытался использовать собственный репозиторий (который я видел в другом ответе):

@Component
public class BulkRepository<T extends Identifiable> {// Identifiable just has a getId method

    private static final int BATCH_SIZE = 500;

    private final EntityManager entityManager;

    @Autowired
    public BulkRepository(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Transactional
    public <S extends T> List<S> saveInBatch(Iterable<S> value) {
        List<S> entities = Lists.newArrayList(value);
        List<S> saved = new ArrayList<>(entities.size());
        int i = 0;
        for (S t : entities) {
            saved.add(persistOrMerge(t));
            i++;
            if (i % BATCH_SIZE == 0) {
                // Flush a batch of inserts and release memory.
                entityManager.flush();
                entityManager.clear();
            }
        }

        return saved;
    }

    private <S extends T> S persistOrMerge(S t) {
        if (t.getId() == null) {
            entityManager.persist(t);
            return t;
        } else {
            return entityManager.merge(t);
        }
    }
}

Когда я включаю общий журнал запросов в MySql с обоими выше, он показывает каждую вставку как отдельную:

SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';

SELECT 
    event_time,
    user_Host,
    CONVERT(argument USING utf8) as query
FROM mysql.general_log
order by event_time desc
;

2017-12-22 12:31:48.290334 demo_user[demo_user] @ localhost [127.0.0.1] вставить в demo.test_table (id, string) значения (1, 'value1')

2017-12-22 12:31:48.288328 demo_user[demo_user] @ localhost [127.0.0.1] вставить в demo.test_table (id, string) значения (2, 'value2')

Есть что-то, что мне не хватает? На данный момент похоже, что мне нужно обойти Spring JPA и использовать для этого необработанный SQL.


person Eduardo    schedule 22.12.2017    source источник
comment
Нет, это не так... В этом случае драйвер JDBC переписывает пакетные операторы, а не переходит в режим гибернации. См. stackoverflow.com/questions/21530112/   -  person M. Deinum    schedule 22.12.2017
comment
@M.Deinum M.Deinum, однако, они не так отображаются в журнале MySQL (который взят непосредственно из самой базы данных)   -  person Eduardo    schedule 22.12.2017
comment
Мне кажется, что вы опубликовали журнал приложений, а не журнал mysql. Тем не менее, ответ находится в том же вопросе.   -  person M. Deinum    schedule 22.12.2017
comment
@M.Deinum Журнал создан при выполнении запроса над ним напрямую через рабочую среду MySql.   -  person Eduardo    schedule 22.12.2017
comment
Я думаю, что вопрос в другом, я не могу позвонить Transaction t = session.beginTransaction();, как они используют, поскольку моими транзакциями управляет @Transactional. Я получаю исключение, если пытаюсь использовать оба в одном приложении.   -  person Eduardo    schedule 22.12.2017
comment
Ваши свойства spring.jpa.hibernate практически бесполезны. Должно быть spring.jpa.properties.hibernate....   -  person M. Deinum    schedule 22.12.2017
comment
Нет, вопрос не в другом, как запускается транзакция, не имеет значения. Дело в том, что hibernate всегда будет логировать одиночные запросы.   -  person M. Deinum    schedule 22.12.2017
comment
@ M.Deinum, как уже упоминалось, это не журнал гибернации (я знаю, что всегда регистрируются отдельные запросы). Это результат выполнения SQL-запроса в моем вопросе выше.   -  person Eduardo    schedule 22.12.2017
comment
Всегда приятно, если люди пропускают ваши комментарии -> Ваши spring.jpa.hibernate properties практически бесполезны. Должно быть spring.jpa.properties.hibernate   -  person M. Deinum    schedule 22.12.2017
comment
Давайте продолжим это обсуждение в чате.   -  person Eduardo    schedule 22.12.2017