#java #spring #performance #hibernate #web
#java #весна #Производительность #впасть в спящий режим #паутина
Вопрос:
Я запустил новый проект Java Spring Hibernate. На данный момент у меня есть только несколько POJO. Но первые действия hibernate (удаление, создание таблицы и т.д.) происходят слишком поздно, почти через 30 секунд после запуска проекта.
Как я уже сказал, сейчас кода не так уж много. Я очень новичок в веб-разработке на Java и в гибернации. Это мое приложение.свойства:
spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/xe
spring.datasource.username=system
spring.datasource.password=*****
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.hibernate.naming.physical-strategy=com.bmt311.dershane.CustomPhysicalNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
Комментарии:
1. Вы предполагаете, что эти действия «происходят слишком поздно», но рассматривали ли вы переход туда и обратно с компьютера, на котором запущено приложение, в базу данных и обратно для каждого оператора DML? Кроме того, в проектах «реального мира» почти никто не использует «create-drop», а скорее полагается на существующую базу данных, установщик или инструмент миграции БД, но механизмы гибернации слишком просты для чего-то более сложного.
2. Я сделал это предположение, основываясь на том, что я видел в проектах других людей — в основном, в учебных пособиях. Конечно, это не проект реального мира, и я ожидаю некоторых недостатков в производительности, но я думаю, что «25-30 секунд после запуска» — это проблема. Я думаю, что я делаю что-то очень неправильное.
3. Я вижу, что вы используете Oracle, так что вы запускаете его локально или как ваша настройка? В зависимости от того факта, что, например, ваша база данных работает на сервере, а DML необходимо отправлять по сети, время перехода туда и обратно может быть высоким.
4. Да, моя база данных — Oracle, но она установлена на том же компьютере. Поэтому я не ожидаю никаких «сетевых обходов».
5. добавьте
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
к немуapplication.properties
. Также в зависимости от вашей базы данных подготовка схемы может быть медленной. Другое дело, не используйте запрос проверки (в JDBC4 лучше встроены способы проверки соединения, которые уже использует пул соединений).
Ответ №1:
Почему вы всегда воссоздаете базу данных при локальной разработке? Oracle AFAIK делает довольно много вещей (резерв дискового пространства и т.д.) При использовании DDL, поэтому, как правило, использовать create-drop с Oracle — плохая идея. Попробуйте spring.jpa.hibernate.ddl-auto=update
вместо этого использовать для локальной разработки или, что еще лучше, использовать специальный инструмент для управления схемами, такой как Liquibase или Flyway и использовать spring.jpa.hibernate.ddl-auto=none
.
Комментарии:
1. Согласен с этим awnser и, вероятно, использовал бы ddl-auto=validate, чтобы убедиться, что база данных синхронизирована (более или менее).