Тестове завдання. Читання великого (1 Gb) XML файлу та запис в БД, з використанням ORM.
Використано: StAX + JAXB, JPA (Hibernate), INSERT batch processing, Gradle, MySQL/PostgreSQL.
StAX використано для послідовного читання, оскільки завантажувати великий файл в пам'ять не еффективно. Також використано batch processing для підвищення швидкодії запису в БД.
Я помилково вирішив що batch processing на Hibernate/MySQL чомусь не працює (Hibernate показує в своїх logs тільки окремі INSERTs), тож додатково використав PostgreSQL щоб перевірити це.
Time spent: 14.6 h
plus
additional time spent on batch procession details and PostgreSQL: 5.3h
Notes:
-
Ordinary Hibernate log can't show does the batch processing work or not; for MySQL we can use either profileSQL=true in the URL or enable the general_log in server.cnf; for PostgreSQL we should enable log_statement = 'all' in postgresql.conf to monitor the logs in /var/logs;
-
In practice postgresql-9.6-main.log shows that INSERT batch size doesn't match the configuration parameters, it varies;
-
The best size of batched INSERTs in PostgreSQL: [https://stackoverflow.com/q/49250849]
-
Hibernate Batch Processing – Why you may not be using it. Even if you think you are: [https://abramsm.wordpress.com/2008/04/23/hibernate-batch-processing-why-you-may-not-be-using-it-even-if-you-think-you-are/]
-
PgJDBC has some limitations regarding batches: [https://stackoverflow.com/a/20887293]