springboot配置druid数据源和监控

2024-06-03 17:08

本文主要是介绍springboot配置druid数据源和监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据源使用的是阿里的Driud。

1.配置之前 先看一下xml的配置。

-------------------spring-mybatis.xml文件--------------------------
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties" />
<!-- 配置数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="url" value="${jdbc_url}" /><property name="username" value="${jdbc_username}" /><property name="password" value="${jdbc_password}" /><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最大空闲 --><property name="maxIdle" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> --><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><!-- 监控数据库 --><!-- <property name="filters" value="stat" /> --><!-- <property name="filters" value="mergeStat" />-->
</bean>
<!-- myBatis文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --><property name="mapperLocations" value="classpath:/mybatis/*Mapper.xml" /><property name="configLocation" value="classpath:mybatis-interceptor.xml" /> 
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.lcl.springBoot.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
-------------------mybatis-interceptor.xml文件------------------------------
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  
<!-- 配置管理器 -->  
<configuration>  
<plugins>  <!-- com.github.pagehelper为PageHelper类所在包名 -->  <plugin interceptor="com.github.pagehelper.PageHelper">  <!-- 4.0.0以后版本可以不设置该参数 -->  <property name="dialect" value="mysql"/>  <!-- 该参数默认为false -->  <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->  <!-- 和startPage中的pageNum效果一样-->  <property name="offsetAsPageNum" value="true"/>  <!-- 该参数默认为false -->  <!-- 设置为true时,使用RowBounds分页会进行count查询 -->  <property name="rowBoundsWithCount" value="true"/>  <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->  <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->  <property name="pageSizeZero" value="true"/>  <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->  <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->  <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->  <property name="reasonable" value="true"/>  <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->  <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->  <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->  <!-- 不理解该含义的前提下,不要随便复制该配置 -->  <property name="params" value="pageNum=start;pageSize=limit;"/>  <!-- 支持通过Mapper接口参数来传递分页参数 -->  <property name="supportMethodsArguments" value="true"/>  <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->  <property name="returnPageInfo" value="check"/>  </plugin>  
</plugins>  
</configuration> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

这里面可以看到配置了DruidDataSource、SqlSessionFactoryBean、MapperScannerConfigurer三个bean,其中DruidDataSource配置了最基本的链接属性;SqlSessionFactoryBean配置数据源、mapper.xml路径和PageHelper插件填充;MapperScannerConfigurer设置的自动扫描的基本包basePackage跟sqlSessionFactory。 
对应的在springBoot中,我们如果不用xml配置,则可以用@Configuration、@bean来进行注解配置。 
@Configuration注解,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean。

2.看springBoot配置,首先配置DruidDataSource,创建一个DruidDBConfig类,表注@Configuration。代码如下:

@Configuration  
public class DruidDBConfig {  private Logger logger = LoggerFactory.getLogger(DruidDBConfig.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.driverClassName}")  private String driverClassName;  @Value("${spring.datasource.initialSize}")  private int initialSize;   @Value("${spring.datasource.minIdle}")  private int minIdle;  @Value("${spring.datasource.maxActive}")  private int maxActive;  @Value("${spring.datasource.maxWait}")  private int maxWait;  @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")  private int timeBetweenEvictionRunsMillis;  @Value("${spring.datasource.minEvictableIdleTimeMillis}")  private int minEvictableIdleTimeMillis;  @Value("${spring.datasource.validationQuery}")  private String validationQuery;   @Value("${spring.datasource.testWhileIdle}")  private boolean testWhileIdle;  @Value("${spring.datasource.testOnBorrow}")  private boolean testOnBorrow;  @Value("${spring.datasource.testOnReturn}")  private boolean testOnReturn;  @Value("${spring.datasource.poolPreparedStatements}")  private boolean poolPreparedStatements;   @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")  private int maxPoolPreparedStatementPerConnectionSize;  @Value("${spring.datasource.filters}")  private String filters;    @Value("{spring.datasource.connectionProperties}")  private String connectionProperties;   @Bean(value="dataSource")     //声明其为Bean实例  @Primary  //在同样的DataSource中,首先使用被标注的DataSource  public DataSource dataSource(){  DruidDataSource datasource = new DruidDataSource();  datasource.setUrl(this.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);  datasource.setPoolPreparedStatements(poolPreparedStatements);  datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);  try {  datasource.setFilters(filters);  } catch (SQLException e) {  logger.error("druid configuration initialization filter", e);  }  datasource.setConnectionProperties(connectionProperties);  return datasource;  }  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

至此,DruidDataSource数据源在系统运行的时候,会自动创建一个bean。

3.若想使用Druid的监控,则需要额外配置StatViewServlet 和 filterRegistrationBean,这里单独拎出来便于理解,此处配置也可以放置在DruidDBConfig类中。

@Configuration
public class DruidConfiguration { /*** 注册一个StatViewServlet* @return*/@Beanpublic ServletRegistrationBean DruidStatViewServle2(){//org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");//添加初始化参数:initParams//白名单:servletRegistrationBean.addInitParameter("allow","127.0.0.1");//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.servletRegistrationBean.addInitParameter("deny","192.168.1.73");//登录查看信息的账号密码.servletRegistrationBean.addInitParameter("loginUsername","admin2");servletRegistrationBean.addInitParameter("loginPassword","123456");//是否能够重置数据.servletRegistrationBean.addInitParameter("resetEnable","false");return servletRegistrationBean;}   /*** 注册一个:filterRegistrationBean* @return*/@Beanpublic FilterRegistrationBean druidStatFilter2(){       FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());//添加过滤规则.filterRegistrationBean.addUrlPatterns("/*");//添加不需要忽略的格式信息.filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*");return filterRegistrationBean;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

这里的配置类同等于xml配置文件:

<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>
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

同样的还有另外一种方式:

1)创建DruidStatFilter。

@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",  
initParams={  @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源  
}  
)  
public class DruidStatFilter extends WebStatFilter {
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2)创建DruidStatViewServlet。

@WebServlet(urlPatterns="/druid/*",  
initParams={  @WebInitParam(name="allow",value="127.0.0.1,192.168.163.1"),// IP白名单(没有配置或者为空,则允许所有访问)  @WebInitParam(name="deny",value="192.168.1.73"),// IP黑名单 (存在共同时,deny优先于allow)  @WebInitParam(name="loginUsername",value="admin"),// 用户名  @WebInitParam(name="loginPassword",value="123456"),// 密码  @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能  
})  
public class DruidStatViewServlet extends StatViewServlet {  private static final long serialVersionUID = -2688872071445249539L; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.配置sqlSessionFactory,此bean是SqlSessionFactoryBean类型。

@Configuration
public class MyBatisConfig implements TransactionManagementConfigurer{private Logger logger = LoggerFactory.getLogger(MyBatisConfig.class);//@Autowired //private DruidDataSource dataSource;@Value("${spring.datasource.type}")  private Class<? extends DataSource> dataSourceType;  @Bean(name="dataSource", destroyMethod = "close", initMethod="init")  @ConfigurationProperties(prefix = "spring.datasource")  public DataSource dataSource() {return DataSourceBuilder.create().type(dataSourceType).build();  }  @Bean(name = "sqlSessionFactory")//3public SqlSessionFactory sqlSessionFactoryBean() {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource());//bean.setTypeAliasesPackage("com.hjf.boot.demo.boot_mybatis.domain");//分页插件 //4PageHelper pageHelper = new PageHelper();Properties properties = new Properties();properties.setProperty("reasonable", "true");properties.setProperty("supportMethodsArguments", "true");properties.setProperty("returnPageInfo", "check");properties.setProperty("params", "count=countSql");pageHelper.setProperties(properties);//添加插件bean.setPlugins(new Interceptor[]{pageHelper});//添加XML目录ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();try {bean.setMapperLocations(resolver.getResources("classpath:/mybatis/*Mapper.xml"));return bean.getObject();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}@Beanpublic SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}@Beanpublic PlatformTransactionManager annotationDrivenTransactionManager() {return new DataSourceTransactionManager(dataSource());}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

5.配置MapperScannerConfigurer,设置自动扫描。

@Configuration
@AutoConfigureAfter(MyBatisConfig.class)//见文思意,在MyBatisConfig配置之后加载
public class MyBatisMapperScannerConfig {@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();//对应<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");//对应<property name="basePackage" value="com.lcl.springBoot.dao" />mapperScannerConfigurer.setBasePackage("com.lcl.springBoot.dao");return mapperScannerConfigurer;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

至此配置完毕,对于资源文件在resources目录下:

 resources--application.properties//存放资源文件--mybatis//文件夹存放mapper文件--DemoMapper.xml //本人用的测试mapper
  • 1
  • 2
  • 3
  • 4
  • 5

application.properties文件内容(千篇一律,满大街都是= =!):

##DATASOURCE(DataSourceAutoConfiguration&DataSourceProperties)
# 驱动配置信息   
spring.datasource.url = jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username= root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver 
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 
##连接池属性配置
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  
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  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

结尾:在MyBatisConfig中关于DruidDataSource,一开始使用的形式是:

    @Autowired private DruidDataSource dataSource;
  • 1
  • 2
  • 3

此时发现不能自动实例化bean,而后改为一下形式解决,没有看源码不知何故,以后有时间在看源码进行分析:

    @Value("${spring.datasource.type}")  private Class<? extends DataSource> dataSourceType;  @Bean(name="dataSource", destroyMethod = "close", initMethod="init")  @ConfigurationProperties(prefix = "spring.datasource")  public DataSource dataSource() {return DataSourceBuilder.create().type(dataSourceType).build();  }  
       

      这篇关于springboot配置druid数据源和监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



      http://www.chinasem.cn/article/1027593

      相关文章

      详解Java如何向http/https接口发出请求

      《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

      windos server2022的配置故障转移服务的图文教程

      《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

      windos server2022里的DFS配置的实现

      《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

      SpringBoot使用Apache Tika检测敏感信息

      《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

      Java内存泄漏问题的排查、优化与最佳实践

      《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

      JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

      《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

      Java 字符数组转字符串的常用方法

      《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

      java脚本使用不同版本jdk的说明介绍

      《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

      Spring MVC如何设置响应

      《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

      关于Maven中pom.xml文件配置详解

      《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构