摘要:这篇文篇将介绍,如何通过整合数据库链接池实时监控数据库链接信息,为优化数据库性能提供更好的指导,同样将通过配置文件形式进行配置方便简洁。
这篇文篇将介绍,如何通过SpringBoot整合Druid数据库链接池,实时监控数据库链接信息,为优化数据库性能提供更好的指导,同样将通过YML配置文件形式进行配置,方便简洁。
准备工作环境:
</>复制代码
windows
jdk 8
maven 3.0
IDEA
创建数据库表
</>复制代码
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sno` int(15) NOT NULL,
`sname` varchar(50) DEFAULT NULL,
`sex` char(2) DEFAULT NULL,
`dept` varchar(25) DEFAULT NULL,
`birth` date DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ("1", "李同学", "1", "王同学学习成绩很不错", "2010-07-22", "17");
构建工程
</>复制代码
4.0.0
cn.zhangbox
spring-boot-study
1.0-SNAPSHOT
cn.zhangbox
spring-boot-druid
0.0.1-SNAPSHOT
jar
spring-boot-druid
this project for Spring Boot
UTF-8
UTF-8
1.8
3.4
1.10
1.2.0
1.16.14
1.2.41
1.1.2
aliyunmaven
http://maven.aliyun.com/nexus/content/groups/public/
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis-spring-boot.version}
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.apache.commons
commons-lang3
${commons-lang3.version}
commons-codec
commons-codec
${commons-codec.version}
com.alibaba
fastjson
${fastjson.version}
com.alibaba
druid-spring-boot-starter
${druid.version}
org.projectlombok
lombok
${lombok.version}
spring-boot-druid
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.8
1.8
UTF-8
org.apache.maven.plugins
maven-surefire-plugin
2.19.1
org.springframework.boot
spring-boot-maven-plugin
org.springframework
springloaded
1.2.4.RELEASE
cn.zhangbox.admin.SpringBootDruidApplication
-Dfile.encoding=UTF-8 -Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
true
true
org.springframework.boot
spring-boot-maven-plugin
cn.zhangbox.admin.SpringBootDruidApplication
-Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
true
true
注意:这里引入了lombok插件节省编写实体类时候写get和set方法,这里在idea中进行set和get操作需要下载lombok插件,在设置页面的plugins中搜索lombok插件在中央插件库下载后重启idea即可,更详细的lombok使用教程可以查考:
程序员DD的lombok系列教程:Lombok:让JAVA代码更优雅
修改YML配置</>复制代码
#公共配置
server:
port: 80
tomcat:
uri-encoding: UTF-8
spring:
#激活哪一个环境的配置文件
profiles:
active: dev
#连接池配置
datasource:
driver-class-name: com.mysql.jdbc.Driver
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 配置测试查询语句
validationQuery: SELECT 1 FROM DUAL
# 初始化大小,最小,最大
initialSize: 10
minIdle: 10
maxActive: 200
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 180000
testOnBorrow: false
testWhileIdle: true
removeAbandoned: true
removeAbandonedTimeout: 1800
logAbandoned: true
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxOpenPreparedStatements: 100
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,"wall"用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#mybatis
mybatis:
# 实体类扫描
type-aliases-package: cn.zhangbox.springboot.entity
# 配置映射文件位置
mapper-locations: classpath:mapper/*.xml
# 开启驼峰匹配
mapUnderscoreToCamelCase: true
---
#开发环境配置
server:
#端口
port: 8080
spring:
profiles: dev
# 数据源配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
username: root
password: 123456
#日志
logging:
config: classpath:log/logback.xml
path: log/spring-boot-druid
---
#测试环境配置
server:
#端口
port: 80
spring:
profiles: test
# 数据源配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring-boot-druid?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
username: root
password: 123456
#日志
logging:
config: classpath:log/logback.xml
path: /home/log/spring-boot-druid
---
#生产环境配置
server:
#端口
port: 8080
spring:
profiles: prod
# 数据源配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring-boot-druid?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
username: root
password: 123456
#日志
logging:
config: classpath:log/logback.xml
path: /home/log/spring-boot-druid
这里进行了mybatis整合,如果不会mybatis整合可以参考我写的这篇文章:
SpringBoot非官方教程 | 第六篇:SpringBoot整合mybatis
在工程resources文件夹下新建文件夹log,并在该文件夹下创建logback.xml文件,加入以下配置:
</>复制代码
${CONSOLE_LOG_PATTERN}
UTF-8
info
${LOG_PATH}/log_debug.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
500MB
30
debug
ACCEPT
DENY
${LOG_PATH}/log_info.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log
500MB
30
info
ACCEPT
DENY
${LOG_PATH}/log_warn.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
500MB
30
warn
ACCEPT
DENY
${LOG_PATH}/log_error.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log
500MB
30
error
ACCEPT
DENY
注意::loback配置文件中
</>复制代码
name的属性值一定要是当前工程的java代码的完整目录,因为mybatis打印的日志级别是debug级别的,因此需要配置debug级别日志扫描的目录。
创建Druid配置类在工程java代码目录下创建config的目录在下面创建DruidDBConfig类加入以下代码:
</>复制代码
@Configuration
public class DruidDBConfig {
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
//设置控制台管理用户
reg.addInitParameter("loginUsername","root");
reg.addInitParameter("loginPassword","root");
// 禁用HTML页面上的“Reset All”功能
reg.addInitParameter("resetEnable","false");
//reg.addInitParameter("allow", "127.0.0.1"); //白名单
return reg;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
Map initParams = new HashMap();
//忽略过滤的形式
initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.setInitParameters(initParams);
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
注意:这里ServletRegistrationBean 配置bean中通过addInitParameter设置了管控台的用户名密码都是root,可以在这里进行自定义配置也可以将这里的用户名密码通过转移数据库进行定制化配置实现。
创建实体在工程java代码目录下创建entity的目录在下面创建Student类加入以下代码:
</>复制代码
@Data
@EqualsAndHashCode(callSuper = false)
public class Student {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
private Integer sno;
/**
* 学生姓名
*/
private String sname;
/**
* 性别
*/
private String sex;
/**
* 生日
*/
private String birth;
/**
* 年龄
*/
private String age;
/**
* 简介
*/
private String dept;
}
创建Controller
在工程java代码目录下创建controller的目录在下面创建StudentConteroller类加入以下代码:
</>复制代码
@Controller
@RequestMapping("/student")
public class StudentConteroller {
private static final Logger LOGGER = LoggerFactory.getLogger(StudentConteroller.class);
@Autowired
protected StudentService studentService;
/**
* 查询所有的学生信息
*
* @param sname
* @param age
* @param modelMap
* @return
*/
@ResponseBody
@GetMapping("/list")
public String list(String sname, Integer age, ModelMap modelMap) {
String json = null;
try {
List studentList = studentService.getStudentList(sname, age);
modelMap.put("ren_code", "0");
modelMap.put("ren_msg", "查询成功");
modelMap.put("studentList", studentList);
json = JSON.toJSONString(modelMap);
} catch (Exception e) {
e.printStackTrace();
modelMap.put("ren_code", "0");
modelMap.put("ren_msg", "查询失败===>" + e);
LOGGER.error("查询失败===>" + e);
json = JSON.toJSONString(modelMap);
}
return json;
}
}
创建Service
在工程java代码目录下面创建service目录在下面创建StudentService类加入以下代码:
</>复制代码
public interface StudentService {
/**
* 查询所有的学生信息
*
* @param sname
* @param age
* @return
*/
List getStudentList(String sname, Integer age);
}
创建ServiceImpl
在工程java代码目录下的service的目录下面创建impl目录在下面创建StudentServiceImpl类加入以下代码:
</>复制代码
@Service("StudentService")
@Transactional(readOnly = true, rollbackFor = Exception.class)
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
public List getStudentList(String sname, Integer age) {
return studentDao.getStudentList(sname,age);
}
}
创建Dao
在工程java代码目录下创建dao的目录在下面创建StudentDao类加入以下代码:
</>复制代码
public interface StudentDao {
List getStudentList(@Param("sname")String sname, @Param("age")Integer age);
}
创建Mapper映射文件
在工程resource目录下创建mapper的目录在下面创建StudentMapper.xml映射文件加入以下代码:
创建启动类</>复制代码
</>复制代码
@SpringBootApplication
@MapperScan("cn.zhangbox.springboot.dao")//配置mybatis接口包扫描
public class SpringBootDruidApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootDruidApplication.class, args);
}
}
启动项目进行测试:
控制台打印
</>复制代码
. ____ _ __ _ _
/ / ___"_ __ _ _(_)_ __ __ _
( ( )\___ | "_ | "_| | "_ / _` |
/ ___)| |_)| | | | | || (_| | ) ) ) )
" |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.3.RELEASE)
2018-07-07 10:54:52.404 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : Starting SpringBootDruidApplication on HP with PID 24084 (C:UsersAdministratorDesktopspring-boot-studyspring-boot-druid
argetclasses started by Administrator in C:UsersAdministratorDesktopspring-boot-study)
2018-07-07 10:54:52.445 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : The following profiles are active: dev
2018-07-07 10:54:52.570 INFO 24084 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53142455: startup date [Sat Jul 07 10:54:52 CST 2018]; root of context hierarchy
2018-07-07 10:54:52.997 INFO 24084 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 5.3.5.Final
2018-07-07 10:54:53.736 INFO 24084 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean "filterRegistrationBean" with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=druidDBConfig; factoryMethodName=filterRegistrationBean; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [cn/zhangbox/springboot/config/DruidDBConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=com.alibaba.druid.spring.boot.autoconfigure.stat.DruidWebStatFilterConfiguration; factoryMethodName=filterRegistrationBean; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/stat/DruidWebStatFilterConfiguration.class]]
2018-07-07 10:54:54.887 INFO 24084 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-07-07 10:54:54.903 INFO 24084 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2018-07-07 10:54:54.905 INFO 24084 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.14
2018-07-07 10:54:55.123 INFO 24084 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-07-07 10:54:55.124 INFO 24084 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2554 ms
2018-07-07 10:54:55.522 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*]
2018-07-07 10:54:55.525 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "dispatcherServlet" to [/]
2018-07-07 10:54:55.525 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*]
2018-07-07 10:54:55.526 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet statViewServlet was not registered (possibly already registered?)
2018-07-07 10:54:55.531 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "characterEncodingFilter" to: [/*]
2018-07-07 10:54:55.531 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "hiddenHttpMethodFilter" to: [/*]
2018-07-07 10:54:55.532 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "httpPutFormContentFilter" to: [/*]
2018-07-07 10:54:55.533 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "requestContextFilter" to: [/*]
2018-07-07 10:54:55.533 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "webStatFilter" to urls: [/*]
2018-07-07 10:54:57.216 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53142455: startup date [Sat Jul 07 10:54:52 CST 2018]; root of context hierarchy
2018-07-07 10:54:57.322 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/student/list],methods=[GET]}" onto public java.lang.String cn.zhangbox.springboot.controller.StudentConteroller.list(java.lang.String,java.lang.Integer,org.springframework.ui.ModelMap)
2018-07-07 10:54:57.326 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-07-07 10:54:57.328 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2018-07-07 10:54:57.376 INFO 24084 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-07 10:54:57.376 INFO 24084 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-07 10:54:57.451 INFO 24084 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-07 10:54:58.066 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-07-07 10:54:58.068 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name "statFilter" has been autodetected for JMX exposure
2018-07-07 10:54:58.069 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name "dataSource" has been autodetected for JMX exposure
2018-07-07 10:54:58.077 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean "dataSource": registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSource,type=DruidDataSourceWrapper]
2018-07-07 10:54:58.081 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean "statFilter": registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]
2018-07-07 10:54:58.101 INFO 24084 --- [ main] o.a.coyote.http11.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"]
2018-07-07 10:54:58.118 INFO 24084 --- [ main] o.a.coyote.http11.Http11NioProtocol : Starting ProtocolHandler ["http-nio-8080"]
2018-07-07 10:54:58.145 INFO 24084 --- [ main] o.a.tomcat.util.net.NioSelectorPool : Using a shared selector for servlet write/read
2018-07-07 10:54:58.172 INFO 24084 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-07-07 10:54:58.179 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : Started SpringBootDruidApplication in 7.666 seconds (JVM running for 10.386)
2018-07-07 11:00:00.245 INFO 24084 --- [nio-8080-exec-5] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet "dispatcherServlet"
2018-07-07 11:00:00.246 INFO 24084 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : FrameworkServlet "dispatcherServlet": initialization started
2018-07-07 11:00:00.302 INFO 24084 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : FrameworkServlet "dispatcherServlet": initialization completed in 56 ms
2018-07-07 11:00:01.606 INFO 24084 --- [nio-8080-exec-5] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
浏览器请求测试
本地日志打印效果
</>复制代码
2018-07-07 10:54:52.439 [main] DEBUG cn.zhangbox.springboot.SpringBootDruidApplication - Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE
2018-07-07 11:00:01.715 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - ==> Preparing: SELECT s.sno, s.sname, s.sex, s.dept, s.birth, s.age FROM student s WHERE 1 = 1
2018-07-07 11:00:01.881 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - ==> Parameters:
2018-07-07 11:00:01.931 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - <== Total: 2
这里使用logback配置中将不同级别的日志设置了在不同文件中打印,这样很大程度上方便项目出问题查找问题。
Druid管控台Spring Boot整合Druid连接池以及Druid监控源码
欢迎关注我的微信公众号获取更多更全的学习资源,视频资料,技术干货!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71506.html
摘要:下一篇介绍基于的服务注册与调用。服务提供者工程配置这里服务提供者是使用之前进阶教程第三篇整合连接池以及监控改造而来,这里一样的部分就不再重复说明,下面将说明新增的部分。 Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分...
摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...
阅读 1059·2021-09-29 09:35
阅读 1340·2021-09-28 09:36
阅读 1640·2021-09-24 10:38
阅读 1179·2021-09-10 11:18
阅读 717·2019-08-30 15:54
阅读 2623·2019-08-30 13:22
阅读 2049·2019-08-30 11:14
阅读 851·2019-08-29 12:35