公司来了新人,经常会出现项目启动的过程中卡住而使得项目无法启动,如下图所示:
这个问题一般是因为公司的项目继承了 Spring 与 Mybatis,在使用了如下配置的情况下,当mapper.xml出现了sql书写问题或者sql 的id重复问题,并不会抛出异常,日志打印也就卡在了上图的情况。有经验的同事很容易找到问题,没有经验的新手没有日志打印,即使知道是mapper.xml中的原因,也很难定位问题。
<!-- define the SqlSessionFactory --> <!--创建sqlsession 定义mappersu--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
解决方式是手写一个继承自mybatis的SqlSessionFactoryBean的类,覆盖其buildSqlSessionFactory()方法,捕获异常并打印异常日志,替代SqlSessionFactoryBean。
代码如下:
package com.bvdata.power.functions; import org.apache.ibatis.executor.ErrorContext; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; public class FixedSessionFactoryBean extends SqlSessionFactoryBean { @Override protected SqlSessionFactory buildSqlSessionFactory() { try { return super.buildSqlSessionFactory(); }catch (Exception e){ e.printStackTrace(); }finally { ErrorContext.instance().reset(); } return null; } }
<bean id="sqlSessionFactory" class="com.bvdata.power.functions.FixedSessionFactoryBean">
重新启动之后即可看到之前日志打印停顿的地方打印出了异常日志。
由打印出的异常我们知道了是DefectV2NegoTaskDownMapper.xml中的batchAddRelaDefect sql出了问题。
再从具体的位置发现问题原因如下:
原来是两条sql的id重复。