在构造函数注入的存储库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
}
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是空的构造函数强度。现在使用空的构造函数和方法只需不到一秒钟。
答案 0 :(得分:2)
我在“慢线”上看到一个passwordEncoder.encode(pass)
。这就是为什么我认为这可能是经典的“ / dev / urandom”问题。
https://ruleoftech.com/2016/avoiding-jvm-delays-caused-by-random-number-generation
如果您是从IDE运行此代码,请确保实际的JVM(运行您的程序而不是IDE)具有此配置。