JdkDynamicAopProxy занимает более 1 минуты для запуска метода вызова, когда прокси аннотированного компонента @Repository - PullRequest
0 голосов
/ 31 октября 2019

Проблема

У меня возникла очень странная проблема при вызове метода save для моего встроенного в конструктор компонента репозитория. Я сузил проблему до JdkDynamicAopProxy, который является первым вызванным методом, видимым в обзоре фреймов intelliJ. Я поставил точку останова на первой строке метода invoke. От вызова до точки останова требуется более минуты. Ничего (заметно) не происходит между этими двумя кадрами.

Код

Контроллер

    @Controller
    class LoginController(private val userRepository: UserRepository, val passwordEncoder: PasswordEncoder) {

        @PostMapping(value = ["/register"])
        fun register(@RequestParam("mail") mail: String?, @RequestParam("password") pass: String?, model: Model) : ModelAndView
        {
            val modelAndView = ModelAndView("index")
            if (mail == null || mail == "" || pass == null || pass == "") {
                modelAndView.status = HttpStatus.NOT_ACCEPTABLE;
                return modelAndView
            }
            // IT IS THE NEXT LINE WHICH IS CAUSING THE LONG WAIT...
            userRepository.save(User(email = mail, password = passwordEncoder.encode(pass), newPassword = pass, firstname = "Test", lastname = "Persoon"))
            modelAndView.status = HttpStatus.OK
            return modelAndView

        }
    }

Пользовательский репозиторий

    @Repository
    interface UserRepository : JpaRepository<User, Long> {
        fun findByEmail(email: String): User
    }

application.properties

    spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=GMT%2B1&useSSL=FALSE&allowPublicKeyRetrieval=true
    spring.datasource.username=username
    spring.datasource.password=password
    spring.datasource.hikari.connectionTimeout=20000
    spring.datasource.hikari.maximumPoolSize=5
    spring.datasource.hikari.poolName=Connections

    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jpa.database=mysql
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

    spring.thymeleaf.suffix=.xhtml

    logging.level.org.springframework=INFO
    logging.level.com.zaxxer=ERROR
    logging.level.com.jenson=INFO
    logging.level.root=ERROR
    logging.level.org.hibernate.type=TRACE

Кадры

Из реестра: 33, loginController Для вызова: 157, JdkDynamicAopProxy Это занимает более 1 минуты.

Кажется, я не могу ввести этот один "кадр" между ..

Обзор последних кадров во время выполнения

РЕДАКТИРОВАТЬ: РЕШЕНИЕ В КОНЦЕ

Проблема была не в вызове, а в кодировании пароля.

Проблема была в компоненте BCryptEncoder.

    fun bCryptEncoder() : PasswordEncoder = BCryptPasswordEncoder(20)

Проверка в исходном коде BCryptEncoder говорит мне, что 10 - сила пустого конструктора. Использование пустого конструктора и метода теперь занимает менее секунды.

1 Ответ

2 голосов
/ 01 ноября 2019

Я вижу passwordEncoder.encode(pass) на этой "медленной линии". Вот почему я думаю, что это может быть классическая проблема "/ dev / urandom".

https://ruleoftech.com/2016/avoiding-jvm-delays-caused-by-random-number-generation

Если вы запускаете этот код из IDE, убедитесь, что фактическая JVM (чтозапускает вашу программу, а не вашу IDE) имеет эту конфигурацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...