У меня есть служба (JHipster4), которая использует репозитории JPA для управления базой данных Postgres. Эта служба импортирует CSV и создает множество объектов. Открытый метод, который создает объекты, помечается @Transactional (import org.springframework.transaction.annotation.Transactional)
При запуске автономного приложения (bootRun, OpenJDK 1.8, внутренний сервер Tomcat) импорт выполняется быстро с 700 объектами / с. Как только импорт завершится, я сразу вижу данные, появляющиеся в базе данных. Это позволяет мне быть уверенным, что транзакция работает правильно.
Как только я разверну свое приложение на payara 4.1, аннотация @Transactional, похоже, не будет работать так, как раньше. Я вижу, что база данных заполняется построчно, и скорость низкая (20 объектов / с), как без @ Transactional.
В рамках моего импорта я усекаю таблицы базы данных, используя entityManager и createNativeQuery (..). ExecuteUpdate ();
Если я удалю @Transactional, я получу
javax.persistence.TransactionRequiredException: Executing an update/delete
что хорошо. На Glassfish с @Transactional я не получаю такую ошибку (что тоже хорошо), но не похоже, что с точки зрения базы данных выполняется транзакция (объекты медленно заполняются).
Конфигурация Payara полностью по умолчанию. Конфигурация базы данных Spring также минимальна, com.zaxxer.hikari.HikariDataSource, база данных платформы: io.github.jhipster.domain.util.FixedPostgreSQL82Dialect, база данных: POSTGRESQL.
в файле beans.xml я установил bean-discovery-mode = "none", потому что CDI доставил мне проблемы.
Так в чем же основное отличие использования Spring Boot JPA в автономном контексте и в контейнере приложений (glassfish)?
Почему @Transactional работает не так, как в автономной версии? Можете ли вы объяснить, что происходит и как решить?
Заранее спасибо!