问题描述:
项目启动时,未建立数据库链接,导致第一次请求数据时,需要先建立链接,导致耗时过长。
本地开发时尤为明显,线上估计没知觉。
链接日志:
org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:99) - Creating a new SqlSession
com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:721) - {dataSource-1} inited
org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:89) - JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@73cd410] will not be managed by Spring
疑点:
几乎相同配置的其他应用没有这个问题,启动后即可正常访问。
Debug显示数据库链接配置都正常注入。
解决方案:
1、显式调用dataSource.init()方法
2、去掉ConfigurationProperties注解,否则会有rebinder的异常
当该DataSource已经初始化一次之后,如果Spring再次触发EnvironmentChangeEvent事件,会导致使用所有标注了@ConfigurationProperties的DruidDataSourceWrapper重新做参数绑定。这个时候,根据spring的规则,会先绑定DruidDataSourceWrapper对象class上标注的@ConfigurationProperties,而这个参数和factory方法上绑定的参数不一致,这时候就会触发DruidDataSource内对已经inited之后修改属性值抛出的UnsupportOperationException
小问号的许多朋友来了:
为啥其他应用都正常呢?
因为基本上启动程序时,就调用了查询语句。
整个数据源初始化的过程是怎么样的呢~ 稍后补充调用流程图。
网友评论