如何在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 数据库连接池的资料请关注其它相关文章!