SpringBoot配置Druid数据源
在我刚开始接触JDBC的时候,用的是DriveManager驱动来连接数据库的。而现在大多是用DataSource。
这里先简单说一下区别:
1、datasource是与连接池获取连接,而DriverManager是获取与数据库的连接!
DriverManager类的主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据需要使用JDBC驱动程序建立与数据服务器的网络连接。但是建立与数据库的连接是一项较耗资源的工作,频繁的进行数据库连接建立操作会产生较大的系统开销,为了解决上述问题,可以采用数据库连接池技术。
2、datasource内部封装了 DriverManager的使用。。。
DataSource主要是为了方便配置使用。。。 作为OO概念上也需要有这个类和对象来表示数据的来源。。。
3、 jdk api解释
public interface DataSourceextends CommonDataSource, Wrapper
该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服务中注册。
DataSource 接口由驱动程序供应商实现。共有三种类型的实现:
1.基本实现 - 生成标准的 Connection 对象
2.连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
3.分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。
DataSource 对象的属性在必要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点在于,由于可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。
通过 DataSource 对象访问的驱动程序本身不会向 DriverManager 注册。通过查找操作获取 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。
SpringBoot中默认使用的DataSource是org.apache.tomcat.jdbc.pool.DataSource数据源,配置的时候也很简单,引入springboot和jdbc有关的包之后只要简单的几行配置即可:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db_stupayment spring.datasource.username=root spring.datasource.password=4008
然后就是我们的Druid了:
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池
现在就来讲讲在SpringBoot中怎么配置Druid
首先是在pom中加入相关的依赖:
<!--druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency>
然后是配置文件:
#Druid and datasourcee spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db_stupayment spring.datasource.username=root spring.datasource.password=4008 #下面开始是和druid相关的配置 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false #false is the default,the mysql suggested to false,or it will cost a lot of storage #suggested true in the orcale #spring.datasource.poolPreparedStatements=true #spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 spring.datasource.useGlobalDataSourceStat=true spring.datasource.loginUsername=admin spring.datasource.loginPassword=400831 spring.datasource.resetEnable=false spring.datasource.urlMappings=/druid/* spring.datasource.urlPatterns=/* spring.datasource.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* #druid and datasource end
前面五行配置是spring检测的出的配置,相当于告诉spring一些关于数据库的信息,还有连接池的种类。
之后的配置spring都是检测不出的,但我们会在代码的配置文件中引用。
然后关于这些配置的含义,在下面的代码中有注解。
现在来看代码中的配置:(下面的代码都是在一个.java文件中的)
先完成field从配置文件中获取值并注入:
package com.stuPayment.config; import java.sql.SQLException; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; /** * 配置DruidDataSource * @author 85060 * */ @Configuration public class DruidConfig { private Logger logger = LoggerFactory.getLogger(DruidConfig.class); @Value("${spring.datasource.url}") //数据库地址 private String dbUrl; @Value("${spring.datasource.username}") //数据库登录的账号名 private String username; @Value("${spring.datasource.password}") //数据库登录的密码 private String password; @Value("${spring.datasource.driver-class-name}") //数据库驱动名 private String driverClassName; @Value("${spring.datasource.initialSize}") //初始化连接数量 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 private int initialSize; @Value("${spring.datasource.minIdle}")//最小连接数量 private int minIdle; @Value("${spring.datasource.maxActive}") //最大连接数量 private int maxActive; @Value("${spring.datasource.maxWait}") //获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 private String validationQuery; @Value("${spring.datasource.testWhileIdle}") //建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 private boolean testOnReturn; @Value("${spring.datasource.filters}") //属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall private String filters; @Value("${spring.datasource.connectionProperties}") //通过connectProperties属性来打开mergeSql功能;慢SQL记录 private String connectionProperties; @Value("${spring.datasource.useGlobalDataSourceStat}") //合并多个DruidDataSource的监控数据 private boolean useGlobalDataSourceStat; @Value("${spring.datasource.loginUsername}") //在druid监测servlet中配置用的,用来登录监测网页界面的用户名 private String loginUsername; @Value("${spring.datasource.loginPassword}") //在druid监测servlet中配置用的,用来登录监测网页界面的密码 private String loginPassword; @Value("${spring.datasource.resetEnable}") //在druid监测servlet中配置用的,禁用页面上的“Reset All”功能 private String resetEnable; @Value("${spring.datasource.urlMappings}") //在druid监测servlet中配置用的,设置用来访问监测界面的url private String urlMappings; @Value("${spring.datasource.urlPatterns}") //在druid监测filter中配置用的,过滤规则 private String urlPatterns; @Value("${spring.datasource.exclusions}") //在druid监测servlet中配置用的,忽略资源 private String exclusions;
然后是Druid作为DataSource的bean的配置:
/** * druid数据源的配置 * @return */ @Primary // 默认数据源 如果有多个实例,优先注入 @Bean(name = "dataSource", destroyMethod = "close") public DataSource druidDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(dbUrl); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClassName); //configuration dataSource.setInitialSize(initialSize); dataSource.setMinIdle(minIdle); dataSource.setMaxActive(maxActive); dataSource.setMaxWait(maxWait); dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); dataSource.setValidationQuery(validationQuery); dataSource.setTestWhileIdle(testWhileIdle); dataSource.setTestOnBorrow(testOnBorrow); dataSource.setTestOnReturn(testOnReturn); try { dataSource.setFilters(filters); } catch (SQLException e) { // TODO Auto-generated catch block logger.error("druid configuration initialization filter", e); } dataSource.setConnectionProperties(connectionProperties); dataSource.setUseGlobalDataSourceStat(useGlobalDataSourceStat); return dataSource; }
然后是配置与注册druid监测系统的servlet(因为druid提供了个网页界面做监控界面所以要有个servlet)
/** * 配置druid监控系统的servlet * 这里就是注册了一个servlet相当于 * @return */ @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new StatViewServlet());//Druid提供的servlet servletRegistrationBean.addUrlMappings(urlMappings);//设置用来访问监测界面的请求url //添加初始化参数:initParams /** 白名单,如果不配置或value为空,则允许所有 */ //servletRegistrationBean.addInitParameter("allow","127.0.0.1,192.0.0.1"); /** 黑名单,与白名单存在相同IP时,优先于白名单 */ //servletRegistrationBean.addInitParameter("deny","192.0.0.1"); /** 用户名 */ servletRegistrationBean.addInitParameter("loginUsername",loginUsername); /** 密码 */ servletRegistrationBean.addInitParameter("loginPassword",loginPassword); /** 禁用页面上的“Reset All”功能 */ servletRegistrationBean.addInitParameter("resetEnable",resetEnable); return servletRegistrationBean; }
然后是配置与注册druid监控系统的filter
/** * 配置Druid监控系统的filter * 这里就相当于注册了一个filter * @return */ @Bean FilterRegistrationBean druidFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); /** 过滤规则 */ filterRegistrationBean.addUrlPatterns(urlPatterns); /** 忽略资源 */ filterRegistrationBean.addInitParameter("exclusions", exclusions); return filterRegistrationBean; }
在SpringBoot中注册servlet和filter有两种方法,在我的博客“记录一下在SpringBoot中实现简单的登录认证”中有提到filter的两种方法。
最后运行工程,然后输入请求:
输入自己设置的登录账号和密码,成功进入监测界面monitor:
配置成功!!
参考过的博客:
讲DriverManager和DataSource的区别的:
https://www.cnblogs.com/549294286/p/3559422.html
讲DruidDataSource一些配置参数的:
https://www.cnblogs.com/wuyun-blog/p/5679073.html
讲SpringBoot中怎么配置Druid的:
https://www.cnblogs.com/liuchuanfeng/p/7002046.html
https://www.cnblogs.com/Jason-Xiang/p/7992370.html