前言
监控
作为一名 Java 开发者, 相信对 JDBC(Java Data Base Connectivity) 是不会陌生的, JDBC 作为 Java 基础内容, 它提供了一种基准, 据此可以构建更高级的工具和接口, 使数据库开发人员能够编写数据库应用程序. 下面演示下 Springboot 中如何使用 JDBC 操作, 并配置使用 Druid 连接池, 体验 Druid 对数据库操作强大的监控和扩展功能. Alibaba-Durid 官方手册点这里.
1. 数据库准备
使用 MySQL 数据库创建数据库 springboot, 并在库中新建数据表 user 并新增两条信息.
- CREATE TABLE `user` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `age` int(11) DEFAULT NULL,
- `birthday` datetime DEFAULT NULL,
- `password` varchar(32) NOT NULL,
- `skills` varchar(255) DEFAULT NULL,
- `username` varchar(32) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- # 新增数据
- INSERT INTO `springboot`.`user`(`id`, `age`, `birthday`, `password`, `skills`, `username`) VALUES (1, 17, '2019-01-12 21:02:30', '123', 'Go', 'Darcy');
- INSERT INTO `springboot`.`user`(`id`, `age`, `birthday`, `password`, `skills`, `username`) VALUES (3, 23, '2019-01-01 00:11:22', '456', 'Java', 'Chris');
2. 添加依赖
新建一个 Springboot 项目, 这里不说. 添加依赖如下.
- <dependencies>
- <!-- spring jdbc 操作模版 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <!-- springboot web 开发 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <!-- mysql 数据库连接 -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <scope>runtime</scope>
- </dependency>
- <!-- 引入 druid 数据源 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.1.12</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
3. 配置数据源信息
常规的 JDBC 配置不需要配置这么多内容, 这里因为使用了 Druid 连接池, 所以配置了 Druid 部分. 对自动配置不理解的可以查看系列文章 Springboot 系列 (二)Spring Boot 配置文件.
- spring:
- datasource:
- username: root
- password: 123
- url: jdbc:MySQL://127.0.0.1:3306/springboot?characterEncoding=utf-8&serverTimezone=GMT+8
- driver-class-name: com.MySQL.jdbc.Driver
- type: com.alibaba.druid.pool.DruidDataSource
- initialSize: 5
- minIdle: 5
- maxActive: 20
- maxWait: 60000
- timeBetweenEvictionRunsMillis: 60000
- minEvictableIdleTimeMillis: 300000
- validationQuery: SELECT 1 FROM DUAL
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- poolPreparedStatements: true
- # 配置监控统计拦截的 filters, 去掉后监控界面 sql 无法统计,'wall'用于防火墙
- filters: stat
- maxPoolPreparedStatementPerConnectionSize: 20
- useGlobalDataSourceStat: true
- connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
配置完毕之后, 配置信息还不能绑定到 Druid 数据源中, 还需要新建一个配置类绑定数据源和配置信息.
- /**
- * <p>
- * Druid 数据源配置
- *
- * @Author niujinpeng
- * @Date 2019/1/14 22:20
- */
- @Configuration
- public class DruidConfig {
- /**
- * 配置绑定
- * @return
- */
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource")
- public DruidDataSource druid() {
- return new DruidDataSource();
- }
- }
到这里, 数据源已经配置完毕, 编写测试方法测试 druid 连接池是否生效.
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class SpringbootDataJdbcApplicationTests {
- @Autowired
- DataSource dataSource;
- /**
- * 测试 JDBC 数据源
- * @throws SQLException
- */
- @Test
- public void contextLoads() throws SQLException {
- System.out.println(dataSource.getClass());
- Connection connection = dataSource.getConnection();
- System.out.println(connection);
- connection.close();
- }
- }
运行看到 contextLoads 输出信息.
- class com.alibaba.druid.pool.DruidDataSource
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.MySQL.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
- 2019-02-27 14:14:56.144 INFO 12860 --- [ main] com.alibaba.druid.pool.DruidDataSource : {
- dataSource-1
- } inited
- com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3e104d4b
输出日志中的 com.alibaba.druid 说明 Druid 已经生效.
4. 使用 Spring-JDBC
传统的 JDBC 使用中, 需要编写大量代码, 从构造 PreparedStatement 到查询不胜其烦. 面对这样的开发痛点, Spring 封装了 Spring-jdbc. 让我们使用 JdbcTemplate 即可轻松的操作数据库. Spring-jdbc 的详细使用不是这篇文章重点, 只简单演示下是否生效.
编写控制器, 查询一个 user 信息.
- @RestController
- public class JdbcController {
- @Autowired
- JdbcTemplate jdbcTemplate;
- @ResponseBody
- @GetMapping("/query")
- public Map<String, Object> map() {
- List<Map<String, Object>> list = jdbcTemplate.queryForList("select * FROM user");
- return list.get(0);
- }
- }
启动 spring 项目, 请求 /query 接口得到正常响应.
- {
- "id": 1,
- "age": 17,
- "birthday": "2019-01-12T13:02:30.000+0000",
- "password": "123",
- "skills": "Go",
- "username": "Darcy"
- }
可见 Spring-JDBC 已经从数据库中取出了数据信息.
5. 使用 Druid 监控
如果使用 Druid 连接池却不使用监控功能, 那么就有点暴殄天物了. 下面开始配置 Druid 的 SQL 监控功能. 在上面写的 DruidConfig 配置类中增加配置 Druid 的 Servlet 和 Filter.
- /**
- * Druid 的 servlet
- * @return
- */
- @Bean
- public ServletRegistrationBean statViewServlet() {
- ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet());
- Map<String, String> initParams = new HashMap<>();
- initParams.put("loginUsername", "admin");
- initParams.put("loginPassword", "123");
- initParams.put("allow","127.0.0.1");
- bean.setInitParameters(initParams);
- bean.setUrlMappings(Arrays.asList("/druid/*"));
- return bean;
- }
- @Bean
- public FilterRegistrationBean webStatFilter() {
- FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>(new WebStatFilter());
- HashMap<String, String> initParams = new HashMap<>();
- initParams.put("exclusions", "/CSS,/druid/*");
- bean.setInitParameters(initParams);
- bean.setUrlPatterns(Arrays.asList("/*"));
- return bean;
- }
上面配置了 Druid 监控访问路径为 /druid, 登录用户是 admin, 登录密码是 123, 允许访问的 IP 是 127.0.0.1 本机, 不需要监控的请求是 /CSS 和 /druid 开头的请求.
重新启动项目, 访问测试 /query, 然后访问 /durid 登录页.
Druid 登录页
登录后可以看到 SQL 监控信息和 URL 监控等信息.
SQL 监控
URL 监控.
URL 监控
文章代码已经上传到 GitHub Spring Boot jdb.
< 完 >
来源: http://www.jianshu.com/p/532d2cb3a288