Пролетни пакетни вмъквания на данни

Опитвам се да активирам пакетни вмъквания, използвайки 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, низ) стойности (1, 'value1')

2017-12-22 12:31:48.288328 demo_user[demo_user] @ localhost [127.0.0.1] вмъкване в demo.test_table (id, низ) стойности (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 Но не така се появяват в регистрационния файл на MySQL (който е директно от самата база данни)   -  person Eduardo    schedule 22.12.2017
comment
За мен изглежда, че това, което сте публикували, е дневникът на приложението, а не дневникът на mysql. Въпреки това отговорът е в същия въпрос.   -  person M. Deinum    schedule 22.12.2017
comment
@M.Deinum Регистърът е от изпълнение на заявката над него директно чрез MySql workbench   -  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