欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在SpringBoot 中使用 Druid 数据库连接池

程序员文章站 2022-03-13 14:28:53
druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能。这对没有做数据库监控的小项目有很大的吸引力。下列步骤可以让你无脑式的在springboot2.x中使用d...

druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能。这对没有做数据库监控的小项目有很大的吸引力。

下列步骤可以让你无脑式的在springboot2.x中使用druid。

1.maven中的pom文件

<dependency>
	<groupid>com.alibaba</groupid>
	<artifactid>druid</artifactid>
	<version>1.1.14</version>
</dependency>
<dependency>
	<groupid>log4j</groupid>
	<artifactid>log4j</artifactid>
	<version>1.2.17</version>
</dependency>

使用 spring boot-2.x时,如果未引入log4j,在配置 druid 时,会遇到caused by: java.lang.classnotfoundexception: org.apache.log4j.priority的报错。因为spring boot默认使用的是log4j2。

2.springboot 配置文件

下面是一个完整的yml文件的,其中使用mybatis作为数据库访问框架

server:
 servlet:
 context-path: /
 session:
  timeout: 60m
 port: 8080

spring:
 datasource:
 url: jdbc:mysql://127.0.0.1:9080/hospital?allowmultiqueries=true&useunicode=true&characterencoding=utf-8&zerodatetimebehavior=converttonull
 username: root
 password: root
 # 环境 dev|test|pro
 profiles:
  active: dev
 driver-class-name: com.mysql.cj.jdbc.driver

 ########################## druid配置 ##########################
 type: com.alibaba.druid.pool.druiddatasource
 # 初始化大小,最小,最大 
 initialsize: 5
 minidle: 1
 maxactive: 20
  # 配置获取连接等待超时的时间 
 maxwait: 60000
 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
 timebetweenevictionrunsmillis: 60000
 # 配置一个连接在池中最小生存的时间,单位是毫秒 
 minevictableidletimemillis: 300000
 # 校验sql,oracle配置 validationquery=select 1 from dual,如果不配validationquery项,则下面三项配置无用 
 validationquery: select 1 from dual
 testwhileidle: true
 testonborrow: false
 testonreturn: false
 # 打开pscache,并且指定每个连接上pscache的大小 
 poolpreparedstatements: true
 maxpoolpreparedstatementperconnectionsize: 20
 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 
 filters: stat,wall,log4j
 # 通过connectproperties属性来打开mergesql功能;慢sql记录 
 connectionproperties: druid.stat.mergesql=true;druid.stat.slowsqlmillis=5000
 # 合并多个druiddatasource的监控数据 
 useglobaldatasourcestat: true
 
# mybatis配置
mybatis:
 mapperlocations: classpath:mapper/*.xml,classpath:mapper/extend/*.xml
 configuration:
 map-underscore-to-camel-case: true
 log-impl: org.apache.ibatis.logging.stdout.stdoutimpl

3.配置druid数据源实例

由于druid暂时不在spring boot中的直接支持,故需要进行配置信息的定制:

springboot中的配置信息无法再druid中直接生效,需要在spring容器中实现一个datasource实例。

import java.sql.sqlexception;
import javax.sql.datasource;
import org.apache.log4j.logger;
import org.springframework.beans.factory.annotation.value;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.primary;

import com.alibaba.druid.pool.druiddatasource;

@configuration
public class druiddbconfig {
	private logger logger = logger.getlogger(this.getclass());	//log4j日志

	@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}")
	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 // 声明其为bean实例
	@primary // 在同样的datasource中,首先使用被标注的datasource
	public datasource datasource() {
		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);
		datasource.setpoolpreparedstatements(poolpreparedstatements);
		datasource.setmaxpoolpreparedstatementperconnectionsize(maxpoolpreparedstatementperconnectionsize);
		try {
			datasource.setfilters(filters);
		} catch (sqlexception e) {
			//logger.error("druid configuration initialization filter", e);
			logger.error("druid configuration initialization filter", e);
			e.printstacktrace();
		}
		datasource.setconnectionproperties(connectionproperties);

		return datasource;
	}

}

4.过滤器和servlet

还需要实现一个过滤器和servlet,用于访问统计页面。

过滤器

import javax.servlet.annotation.webfilter;
import javax.servlet.annotation.webinitparam;
import com.alibaba.druid.support.http.webstatfilter;
@webfilter(filtername="druidwebstatfilter",urlpatterns="/*",
 initparams={
 @webinitparam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源
 }
)
public class druidstatfilter extends webstatfilter {
 }

servlet

import javax.servlet.annotation.webinitparam;
import javax.servlet.annotation.webservlet;
 
import com.alibaba.druid.support.http.statviewservlet;
 
@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="admin"),// 密码
   @webinitparam(name="resetenable",value="false")// 禁用html页面上的“reset all”功能
})
public class druidstatviewservlet extends statviewservlet {
	private static final long serialversionuid = -2688872071445249539l;
 
}

5.使用@servletcomponentscan注解,

使得刚才创建的servlet,filter能被访问,springboot扫描并注册。

@springbootapplication()
@mapperscan("cn.china.mytestproject.dao")
//添加servlet组件扫描,使得spring能够扫描到我们编写的servlet和filter
@servletcomponentscan
public class mytestprojectapplication {
 public static void main(string[] args) {
 springapplication.run(mytestprojectapplication.class, args);
 } 
}

6.dao层

接着dao层代码的实现,可以使用mybatis,或者jdbctemplate等。此处不举例。

7.运行

访问http://localhost:8080/druid/login.html地址即可打开登录页面,账号在之前的servlet代码中。

如何在SpringBoot 中使用 Druid 数据库连接池

至此完成。

要了解更多,访问:

以上就是springboot 中使用 druid 数据库连接池的实现步骤的详细内容,更多关于springboot 中使用 druid 数据库连接池的资料请关注其它相关文章!