上面这样配置DruidDataSource,所有数据源的属性值都会选用默认值,如果想深度定制数据源的属性,则需要覆盖由DataSourceConfiguration.Generic创建的数据源,先预设所有需要的配置,为了和内建的spring.datasource属性前缀避嫌,这里自定义一个属性前缀druid,配置文件中添加自定义配置项如下:
druid.url=jdbc:mysql://localhost:3306/local?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false druid.driver-class-name=com.mysql.cj.jdbc.Driver druid.username=root druid.password=root # 初始化大小 druid.initialSize=1 # 最大 druid.maxActive=20 # 空闲 druid.minIdle=5 # 配置获取连接等待超时的时间 druid.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 druid.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 druid.minEvictableIdleTimeMillis=60000 druid.validationQuery=SELECT 1 FROM DUAL druid.testWhileIdle=true druid.testOnBorrow=false druid.testOnReturn=false # 打开PSCache,并且指定每个连接上PSCache的大小 druid.poolPreparedStatements=true druid.maxPoolPreparedStatementPerConnectionSize=20 # 配置监控统计拦截的filters,后台统计相关 druid.filters=stat,wall # 打开mergeSql功能;慢SQL记录 druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000这里要确保本地安装了一个8.x版本的MySQL服务,并且建立了一个命名为local的数据库。
需要在项目中添加一个数据源自动配置类,这里命名为DruidAutoConfiguration,通过注解@ConfigurationProperties把druid前缀的属性注入到数据源实例中:
@Configuration public class DruidAutoConfiguration { @Bean @ConfigurationProperties(prefix = "druid") public DataSource dataSource() { return new DruidDataSource(); } @Bean public ServletRegistrationBean<StatViewServlet> statViewServlet() { ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); // 添加IP白名单 servletRegistrationBean.addInitParameter("allow", "127.0.0.1"); // 添加控制台管理用户 servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "123456"); // 是否能够重置数据 servletRegistrationBean.addInitParameter("resetEnable", "true"); return servletRegistrationBean; } @Bean public FilterRegistrationBean<WebStatFilter> webStatFilter() { WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(webStatFilter); // 添加过滤规则 filterRegistrationBean.addUrlPatterns("/*"); // 忽略过滤格式 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,"); return filterRegistrationBean; } }可以通过访问${requestContext}/druid/login.html跳转到Druid的监控控制台,登录账号密码就是在statViewServlet中配置的用户和密码:
Druid是一款争议比较多的数据源框架,项目的Issue中也有人提出过框架中加入太多和连接池无关的功能,例如SQL监控、属性展示等等,这些功能本该让专业的监控软件完成。但毫无疑问,这是一款活跃度比较高的优秀国产开源框架。
配置schema和data脚本spring-boot-starter-jdbc可以通过一些配置然后委托DataSourceInitializerInvoker进行schema(一般理解为DDL)和data(一般理解为DML)脚本的加载和执行,具体的配置项是:
# 定义schema的加载路径,可以通过英文逗号指定多个路径 spring.datasource.schema=classpath:/ddl/schema.sql # 定义data的加载路径,可以通过英文逗号指定多个路径 spring.datasource.data=classpath:/dml/data.sql # 可选 # spring.datasource.schema-username= # spring.datasource.schema-password= # 项目数据源初始化之后的执行模式,可选值EMBEDDED、ALWAYS和NEVER spring.datasource.initialization-mode=always类路径的resources文件夹下添加ddl/schema.sql:
DROP TABLE IF EXISTS customer; CREATE TABLE customer ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '主键', customer_name VARCHAR(32) NOT NULL COMMENT '客户名称', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', edit_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' ) COMMENT '客户表';