<!--导入 JDBC 场景启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <!--导入数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--采用自定义方式整合 druid 数据源--> <!--自定义整合需要编写一个与之相关的配置类--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency>
我们知道,Spring Boot 使用 HikariCP 作为其默认数据源,但其中有一个十分重要的条件,如下图。
图1:Hikari 数据源生效条件
package net.biancheng.www.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.sql.DataSource; import java.sql.SQLException; @Configuration public class MyDataSourceConfig implements WebMvcConfigurer { /** * 当向容器中添加了 Druid 数据源 * 使用 @ConfigurationProperties 将配置文件中 spring.datasource 开头的配置与数据源中的属性进行绑定 * @return */ @ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource(); //我们一般不建议将数据源属性硬编码到代码中,而应该在配置文件中进行配置(@ConfigurationProperties 绑定) // druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/bianchengbang_jdbc"); // druidDataSource.setUsername("root"); // druidDataSource.setPassword("root"); // druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); return druidDataSource; } }
#数据源连接信息 spring: datasource: username: root password: root url: jdbc:mysql://127.0.0.1:3306/bianchengbang_jdbc driver-class-name: com.mysql.cj.jdbc.Driver
至此,我们就已经将数据源从 HikariCP 切换到了 Druid 了。
接下来,我们可以使用 Spring Boot 提供的默认测试类 SpringBootAdminexApplicationTests 进行简单的测试,来验证数据源类型是否为 Druid 以及是否能正常获取数据库连接、访问数据库,代码如下。
package net.biancheng.www; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import java.sql.SQLException; @SpringBootTest class SpringBootAdminexApplicationTests { //数据源组件 @Autowired DataSource dataSource; //用于访问数据库的组件 @Autowired JdbcTemplate jdbcTemplate; @Test void contextLoads() throws SQLException { System.out.println("默认数据源为:" + dataSource.getClass()); System.out.println("数据库连接实例:" + dataSource.getConnection()); //访问数据库 Integer i = jdbcTemplate.queryForObject("SELECT count(*) from `user`", Integer.class); System.out.println("user 表中共有" + i + "条数据。"); } }
运行测试程序,结果如下。
默认数据源为:class com.alibaba.druid.pool.DruidDataSource 数据库连接实例:com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@46e190ed user 表中共有2条数据。
根据以上运行结果可以看出,数据源已经成功地切换到了 Druid 数据源,且通过它也可以正常的获取数据库连接,访问数据库。
<servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>
/** * 开启 Druid 数据源内置监控页面 * * @return */ @Bean public ServletRegistrationBean statViewServlet() { StatViewServlet statViewServlet = new StatViewServlet(); //向容器中注入 StatViewServlet,并将其路径映射设置为 /druid/* ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(statViewServlet, "/druid/*"); //配置监控页面访问的账号和密码(选配) servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "123456"); return servletRegistrationBean; }
图2:Druid 内置监控页面的登陆页
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ... ... <property name="filters" value="stat" /> </bean>
@ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource(); //设置 filters 属性值为 stat,开启 SQL 监控 druidDataSource.setFilters("stat"); return druidDataSource; }
@Controller public class IndexController { //自动装配 jdbcTemplate @Autowired JdbcTemplate jdbcTemplate; /** * 访问"/testSql",访问数据库 * @return */ @ResponseBody @GetMapping("/testSql") public String testSql() { String SQL = "SELECT count(*) from `user`"; Integer integer = jdbcTemplate.queryForObject(SQL, Integer.class); return integer.toString(); } }
图4:访问数据库
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ... ... <property name="filters" value="wall" /> </bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ... <property name="filters" value="wall,stat"/> </bean>
@ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource(); //同时开启 sql 监控(stat) 和防火墙(wall),中间用逗号隔开。 //开启防火墙能够防御 SQL 注入攻击 druidDataSource.setFilters("stat,wall"); return druidDataSource; }
图6:访问数据库
<filter> <filter-name>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
/** * 向容器中添加 WebStatFilter * 开启内置监控中的 Web-jdbc 关联监控的数据 * @return */ @Bean public FilterRegistrationBean druidWebStatFilter() { WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(webStatFilter); // 监控所有的访问 filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); // 监控访问不包括以下路径 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; }
图8:访问数据库
图9:Druid Web 应用模块
与此同时,URI 监控和 Session 监控也都被开启,如下图。
图10:Druid URI 监控
<!--添加 druid 的 starter--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
################################################## JDBC 通用配置 ########################################## spring: datasource: username: root #数据库登陆用户名 password: root #数据库登陆密码 url: jdbc:mysql://127.0.0.1:3306/bianchengbang_jdbc #数据库url driver-class-name: com.mysql.cj.jdbc.Driver #数据库驱动
################################################## Druid连接池的配置 ########################################## spring: datasource: druid: initial-size: 5 #初始化连接大小 min-idle: 5 #最小连接池数量 max-active: 20 #最大连接池数量 max-wait: 60000 #获取连接时最大等待时间,单位毫秒 time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒 validation-query: SELECT 1 FROM DUAL #测试连接 test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性 test-on-borrow: false #获取连接时执行检测,建议关闭,影响性能 test-on-return: false #归还连接时执行检测,建议关闭,影响性能 pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭 max-pool-prepared-statement-per-connection-size: 20 #开启poolPreparedStatements后生效 filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 wall:防御sql注入 connection-properties: 'druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000' #通过connectProperties属性来打开mergeSql功能;慢SQL记录
###################################################### Druid 监控配置信息 ########################################## spring: datasource: druid: # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置 stat-view-servlet: enabled: true #是否开启内置监控页面,默认值为 false url-pattern: '/druid/*' #StatViewServlet 的映射路径,即内置监控页面的访问地址 reset-enable: true #是否启用重置按钮 login-username: admin #内置监控页面的登录页用户名 username login-password: admin #内置监控页面的登录页密码 password # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter web-stat-filter: enabled: true #是否开启内置监控中的 Web-jdbc 关联监控的数据 url-pattern: '/*' #匹配路径 exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' #排除路径 session-stat-enable: true #是否监控session # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置 aop-patterns: net.biancheng.www.* #Spring监控AOP切入点,如x.y.z.abc.*,配置多个英文逗号分隔
# ####################################################### Druid 监控配置信息 ########################################## spring: datasource: druid: # 对配置已开启的 filters 即 stat(sql 监控) wall(防火墙) filter: #配置StatFilter (SQL监控配置) stat: enabled: true #开启 SQL 监控 slow-sql-millis: 1000 #慢查询 log-slow-sql: true #记录慢查询 SQL #配置WallFilter (防火墙配置) wall: enabled: true #开启防火墙 config: update-allow: true #允许更新操作 drop-table-allow: false #禁止删表操作 insert-allow: true #允许插入操作 delete-allow: true #删除数据操作
本文链接:http://task.lmcjl.com/news/18202.html