{message:Parsed configuration file: 'class path resource [mybatisConfig.xml]'}启动卡死

本文详细分析了Spring项目在启动过程中,由于数据库连接问题导致的卡死现象,并通过调整DBCP连接池配置成功解决了问题。经过一系列排查,最终确认是数据库自身存在问题,重启数据库后问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

重新启动一个早已经运行很长时间的项目,当进行到如下进度时,启动卡死,没有抛出任何异常:

2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)] -- {message:Eagerly caching bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' to allow for resolving potential circular references}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'dataSource'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1498)] -- {message:Invoking afterPropertiesSet() on bean with name 'sqlSessionFactory'}
2014-05-07 10:45:23 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Parsed configuration file: 'class path resource [mybatisConfig.xml]'}
2014-05-07 11:32:02 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Property 'mapperLocations' was not specified or no matching resources found}
2014-05-07 11:32:02 [DEBUG] [org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)] -- {message:Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'}
2014-05-07 11:32:02 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'sqlSessionFactory'}

从日志中可以看出,一直到11:32,也就是过了47分钟之后,才继续往下启动。


原因分析:

spring加载mybatisCofig.xml,考虑是不是数据库连接问题,查询配置信息如下:

initialSize=10
maxActive=20
maxWait=60000

1.考虑连接数据库连接数问题,经查,数据库连接数有300,已使用还只有100多

2.考虑连接等待时间问题,将maxWait时间改为6000,也就是6s,启动之后还是一样卡死

3,查询dbcp连接配置,增加如下配置,打印dbcp连接日志:

<!--removeAbandoned: 是否自动回收超时连接--> 
<property name="removeAbandoned" value="true"/> 
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)--> 
<property name="removeAbandonedTimeout" value="180"/> 
<!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒--> 

同时spring中做相应配置改变。

此时启动,发现启动不再卡死,很快就启动完毕,同时抛出异常。

2014-05-07 11:59:18 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1498)] -- {message:Invoking afterPropertiesSet() on bean with name 'sqlSessionFactory'}
2014-05-07 11:59:19 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Parsed configuration file: 'class path resource [mybatisConfig.xml]'}
AbandonedObjectPool is used (org.apache.commons.dbcp.AbandonedObjectPool@2cea3932)
   LogAbandoned: true
   RemoveAbandoned: true
   RemoveAbandonedTimeout: 10
2014-05-07 12:00:25 [ERROR] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.error(JakartaCommonsLoggingImpl.java:38)] -- {message:Could not get a databaseId from dataSource}
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Io 异常: Connection reset)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1244)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
        at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseProductName(VendorDatabaseIdProvider.java:76)
        at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseName(VendorDatabaseIdProvider.java:61)
        at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseId(VendorDatabaseIdProvider.java:49)
        at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:445)
        at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:336)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)

 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.sql.SQLException: Io 异常: Connection reset
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:254)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
        at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1266)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1240)
        ... 83 more

证明是数据库本身存在问题,最终重启oracle,解决问题。





org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception with message: class path resource [Mapper/*.xml] cannot be opened because it does not exist at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1361) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.3.jar:
03-11
### MyBatis 日志初始化过程及 StdOutImpl 适配器解析 MyBatis 的日志功能通过 `org.apache.ibatis.logging` 包中的实现完成,其中 `StdOutImpl` 是一种简单的标准输出日志适配器。当配置文件中指定 `log-impl: org.apache.ibatis.logging.stdout.StdOutImpl`[^1] 后,MyBatis 将使用该适配器打印 SQL 执行的日志信息。 #### 日志初始化流程 在 MyBatis 初始化过程中,会加载全局配置并设置日志工厂 (`LogFactory`)。以下是具体步骤: 1. **读取配置** 当 MyBatis 解析 XML 配置文件时,如果发现 `<settings>` 中存在 `logImpl` 属性,则将其映射为对应的日志实现类[^3]。例如,在 YAML 文件中: ```yaml mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 2. **创建 Log 实例** 在 MyBatis 内部,`BaseExecutor` 和其他组件会调用 `LogFactory.getLog(Class<?> clazz)` 创建具体的日志实例。对于 `StdOutImpl`,它会在控制台直接输出调试信息。 3. **执行 SQL 并记录日志** 每次执行查询或更新操作时,MyBatis 使用当前绑定的 `Log` 对象记录 SQL 文本及其参数值。这使得开发者可以轻松跟踪数据库交互细节。 #### Parsed Mapper File (Mapper 文件解析) MyBatis启动阶段会对所有的 Mapper 映射文件进行扫描和注册。这一过程涉及以下几个核心环节: 1. **定位 Mapper 资源路径** - 如果在 Spring Boot 应用程序中启用了 MyBatis 支持,则可以通过如下方式指明 Mapper 文件的位置: ```yaml mybatis: mapper-locations: classpath:mapper/*.xml ``` - 若未提供此属性,可能会触发警告消息 `"Property 'mapperLocations' was not specified"`[^4]。 2. **构建 SqlSessionFactory** - FactoryBean 类型的对象(如 `MapperFactoryBean`)负责动态代理目标 Mapper 接口,并关联底层 Session 工作流[^2]。 - 关键方法 `getObject()` 返回由 MyBatis 提供的实际 Mapper 实现对象。 3. **验证 Mapper 定义的有效性** - MyBatis 自动校验每个 XML 文件内的语句节点 (<select>, <insert> 等),并与 Java Interface 方法签名匹配。 - 错误通常源于命名冲突、SQL 片段缺失或其他语法违规情况。 --- ### 示例代码片段展示如何启用日志与解析 Mapper 文件 以下是一个完整的 Spring Boot + MyBatis 集成案例,演示了如何正确配置日志以及处理 Mapper 文件位置。 ```java // Application Configuration @Configuration @MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory") public class MyBatisConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setTypeAliasesPackage("com.example.model"); // 设置实体别名包 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:mapper/**/*.xml")); // 加载 Mapper 文件 return factoryBean.getObject(); } } ``` YAML 配置部分可补充如下内容以便增强可观测性: ```yaml logging: level: com.example.mapper: DEBUG # 开启特定 Mapper 的 Debug 输出 mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值