hibernate启动慢的其中一个原因

本文介绍了一种在使用Hibernate框架时遇到的启动速度过慢的问题,并通过修改*.hbm.xml文件中的DTD引用地址解决了该问题,将启动时间从4分钟缩短至14秒。

今天突然遇到一个问题,就是加了hibernate 框架的项目在启动的时候,特别慢,竟然达到了4分多钟,查来查去,看到我的bean类里*.hbm.xml,有这样的写法:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
……
然后我换成了:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
……
这样启动的时候就不慢了。
归结原因是因为hiberante版本问题,在高版本的用上面的可以,在低版本的用上面的,在不联网的时候就会报错,联网时启动特别慢

 

我这边的启动时间真的也如该文作者达到了4分钟,都快崩溃了,之前两分钟,还以为是自己的电脑配置低,最后慢到了4分钟,果断查原因,终于看到这篇文章,速度改了之后,时间减少到了14秒,那感觉,你懂得!!!!

转载自:http://www.2cto.com/kf/201211/170554.html

<think>嗯,用户现在想分析SpringBoot应用启动原因,特别是与AuthenticationManager和UserDetailsService相关的警告。之前用户提供的日志里有关于GlobalAuthenticationManager配置的警告,还有BeanPostProcessor的问题,以及Hibernate的警告。我需要先回顾一下之前的回答,确保这次的问题和之前的建议一致,同时深入分析启动的可能原因。首先,用户提到应用启动耗时150秒,这显然太长了。可能的原因包括Bean初始化顺序问题、配置不当、依赖过多或者资源加载。特别是日志中的警告:“Global AuthenticationManager configuredwith anAuthenticationProviderbean.UserDetailsService beanswill notbe used...”这说明可能存在多个认证相关的Bean,导致SpringSecurity在初始化时需要处理更多的配置,从而拖启动速度。接下来,我需要考虑AuthenticationManager和UserDetailsService之间的关系。当同时存在自定义的AuthenticationProvider和UserDetailsService时,SpringSecurity可能会进行额外的检查或配置,导致初始化时间增加。例如,如果用户同时配置了多个UserDetailsService实例,或者存在循环依赖,这都会影响启动性能。 另外,之前的回答提到了BeanPostProcessor的警告,这些BeanPostProcessor可能在初始化过程中被多次调用,尤其是在非静态的情况下,导致处理时间延长。需要检查是否有自定义的BeanPostProcessor,或者第三方库带来的BeanPostProcessor,这些都可能影响启动速度。 还有Hibernate的Dialect警告,虽然可能不直接导致启动,但配置不当可能导致Hibernate启动时进行额外的检测,比如自动选择Dialect的过程可能耗时,尤其是在数据库连接较的情况下。需要确认数据库连接的配置是否正确,连接池是否合理,以及是否显式指定了Dialect以减少检测时间。用户可能没有意识到,SpringSecurity的默认配置会扫描所有的UserDetailsService,如果有多个实现类,或者配置了多个AuthenticationProvider,会导致初始化过程复杂化。这时候需要简化配置,明确指定使用的Bean,或者使用惰性初始化来推迟某些Bean的创建时间。 另外,应用启动时的其他因素,比如大量的JPA实体扫描、复杂的AOP切面、过多的自动配置类,也可能导致启动。需要综合检查应用的依赖和配置,使用SpringBoot的启动分析工具来定位瓶颈。 最后,用户可能需要具体的步骤来诊断和优化启动时间,比如启用调试日志、使用SpringBoot Actuator的startup端点,或者进行性能分析。这些方法可以帮助用户精确找到耗时最长的组件,从而有针对性地进行优化。</think>### Spring Boot应用启动分析与优化(认证模块专项) #### 一、认证模块相关警告的核心问题 在日志中出现的`Global AuthenticationManager configured with an AuthenticationProvider bean. UserDetailsService beans will not be used...`警告表明: 1. **双重认证机制冲突** - 同时存在`AuthenticationProvider`和`UserDetailsService`实现时,Spring Security默认优先使用`AuthenticationProvider`[^1] - 导致`UserDetailsService`未被使用,但初始化过程仍会扫描所有相关Bean 2. **初始化时间消耗公式** 认证模块初始化时间$T_{auth}$可建模为: $$ T_{auth} = t_{scan} + n \cdot t_{bean} + k \cdot t_{config} $$ 其中: - $t_{scan}$: 类路径扫描时间 - $n$: 相关Bean数量 - $t_{bean}$: 单个Bean初始化时间 - $k$: 安全配置项数量 - $t_{config}$: 单配置项处理时间 #### 二、性能优化方案 1. **Bean精简策略** ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean @Primary // 明确指定主Bean public AuthenticationProvider customAuthProvider() { return new CustomAuthProvider(); } @Bean @ConditionalOnMissingBean(AuthenticationProvider.class) public UserDetailsService userDetailsService() { return new CustomUserDetailsService(); } } ``` - 使用`@Primary`消除歧义 - 通过`@Conditional`实现条件化Bean注册[^2] 2. **延迟初始化配置** 在`application.properties`中添加: ```properties spring.main.lazy-initialization=true # 全局延迟初始化 spring.security.lazy=true # 安全模块专用延迟 ``` 3. **安全配置优化** ```java @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(customAuthProvider()) .eraseCredentials(false) // 减少凭证处理步骤 .authenticationEventPublisher(null); // 禁用非必要事件 } ``` #### 三、启动耗时诊断工具 1. **启动分析器** 添加启动参数: ```bash java -jar your-app.jar --spring.profiles.active=timing ``` 输出示例: ``` Started AuthServerApplication in 45.234 seconds (JVM running for 47.112) --------------------------- Total startup time: 45.234s AuthenticationManager: 12.34s (27.3%) UserDetailsService: 3.21s (7.1%) ``` 2. **JVM诊断命令** ```bash # 生成JFR记录 jcmd <PID> JFR.start name=auth_profile duration=60s filename=recording.jfr # 分析认证模块耗时 jfr print --events jdk.ClassLoad,spring.beans.instantiate recording.jfr ``` #### 四、进阶优化技巧 1. **类路径优化** ```properties spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration ``` 通过排除非必要自动配置减少扫描范围[^3] 2. **JVM参数调优** ```bash -XX:TieredStopAtLevel=1 # 禁用C2编译器 -noverify # 关闭字节码验证 -Dspring.context.index=true # 启用类路径索引 ``` 3. **模块化安全配置** ```java @Configuration @EnableWebSecurity @Role(BeanDefinition.ROLE_INFRASTRUCTURE) // 标记为基础设施Bean public class FastSecurityConfig extends WebSecurityConfigurerAdapter { // 最小化配置实现 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值