Опитвам се да активирам пакетни вмъквания, използвайки 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 за това.
Transaction t = session.beginTransaction();
, сякаш те използват, тъй като транзакциите ми се управляват от@Transactional
. Получавам изключение, ако се опитам да използвам и двете в едно и също приложение. - person Eduardo   schedule 22.12.2017spring.jpa.hibernate
свойства са почти безполезни. Трябва да еspring.jpa.properties.hibernate....
- person M. Deinum   schedule 22.12.2017spring.jpa.hibernate properties
са почти безполезни. Трябва да еspring.jpa.properties.hibernate
- person M. Deinum   schedule 22.12.2017