2018-11-27 springBoot启动慢

某次在内网(无互联网访问),centos7.3 tomcat7部署boot war包是发现,应用每次卡在:[ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect,时长达10多分钟,使用idea启动boot内嵌tomcat启动时打印如下:

2018-11-27 10:58:39.542 INFO 10488 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect

2018-11-27 10:58:47.689  INFO 10488 --- [  restartedMain] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException

研究发现,boot-start包内部嵌套了hibernate,Hibernate默认是使用jdbc方式来取的,而工程使用的是mybatis+druid方式,jdbc自然获取不到连接;通过在application.properties配置:spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false即可跳过jdbc hibernate连接,测试验证后再linux环境下启动无卡顿;

boot简单灵活性建立在封装了多种常用组件基础之上,例如hibernate jpa核心服务,该问题切入点可以查看

package org.hibernate.engine.jdbc.env.internal;

...

public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEnvironment> {

@Override

public JdbcEnvironment initiateService(Map configurationValues, ServiceRegistryImplementor registry) {

final DialectFactory dialectFactory = registry.getService( DialectFactory.class );

// 'hibernate.temp.use_jdbc_metadata_defaults' is a temporary magic value.

// The need for it is intended to be alleviated with future development, thus it is

// not defined as an Environment constant...

//

// it is used to control whether we should consult the JDBC metadata to determine

// certain Settings default values; it is useful to *not* do this when the database

// may not be available (mainly in tools usage).

boolean useJdbcMetadata = ConfigurationHelper.getBoolean(

"hibernate.temp.use_jdbc_metadata_defaults",

configurationValues,

true

);

...

相关调用链分析可以提供IDE分析即可;

也可以通过springboot删除hibernate服务:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

<!--排除Hibernate相关依赖-->

<exclusions>

<exclusion>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

</exclusion>

<exclusion>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-entitymanager</artifactId>

</exclusion>

</exclusions>

</dependency>

最后编辑于
© 著作权归作者所有,转载或内容合作请联系作者