当@Repository带注释的bean的代理

时间:2019-10-31 19:54:21

标签: spring spring-boot kotlin spring-data-jpa

问题

在构造函数注入的存储库bean上调用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分钟以上。

我似乎无法在两者之间输入那个“框架”。

Overview of the last frames during execution

编辑:最终解决方案

不是呼叫,而是密码编码。

问题出在BCryptEncoder bean中。

    fun bCryptEncoder() : PasswordEncoder = BCryptPasswordEncoder(20)

检入BCryptEncoder的源代码会告诉我10是空的构造函数强度。现在使用空的构造函数和方法只需不到一秒钟。

1 个答案:

答案 0 :(得分:2)

我在“慢线”上看到一个passwordEncoder.encode(pass)。这就是为什么我认为这可能是经典的“ / dev / urandom”问题。

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

如果您是从IDE运行此代码,请确保实际的JVM(运行您的程序而不是IDE)具有此配置。