好用的连接池-druid

Posted lucky9322

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好用的连接池-druid相关的知识,希望对你有一定的参考价值。

druid连接池是阿里巴巴的数据库连接池项目。它的一个亮点强大的监控功能以及防SQL注入,同时不影响性能。这里是它的GitHub地址。感觉druid扩展的功能还是很实用的。

实用的功能

  • 详细的监控
  • ExceptionSorter,针对主流数据库的返回码都有支持
  • SQL防注入
  • 内置加密配置
  • 可自定义扩展

Springboot中druid的使用

在Springboot项目中使用druid作为连接池还是很方便的。

  1. 在依赖文件中添加druid-spring-boot-starter依赖配置。
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
  1. 在application.properties中指定DataSource的类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  1. 启动项目。打开服务地址(ip:port/druid/index.html)即可打开监控平台

技术图片

druid管理平台登陆配置

默认情况下是可以直接打开监控平台的。druid也允许开启登陆模式。

package com.lucky.spring.config;


import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * Created by zhangdd on 2020/7/20
 */
@Component
public class DruidConfig {
    
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名单 (没有配置或者为空,则允许所有访问)
        registrationBean.addInitParameter("deny", "");// IP黑名单 (存在共同时,deny优先于allow)
        registrationBean.addInitParameter("loginUsername", "root");
        registrationBean.addInitParameter("loginPassword", "12345678");
        registrationBean.addInitParameter("resetEnable", "false");
        return registrationBean;
    }
}

重启服务,再次打开http://localhost:8080/druid/index.html,页面如下图所示。这个时候是需要输入用户名和密码才能登陆的。
技术图片

ExceptionSorter

当网络断开或者数据库服务器crash的时候,连接池里面会存在"不可用连接",连接池需要一种机制剔除这些不可用连接。在druid和jboss连接池中,剔除不可用连接的机制称为ExceptionSorter,实现的原理是根据异常的类型/Code/Reason/Message来识别“不可用连接”。没有类似ExceptionSorter的连接池,在数据库重启或者网络中断之后,不能恢复工作,所以ExceptionSorter是连接池是否稳定的重要标志。在Druid中,会根据连接池连接数据库的类型自动匹配不同类型的ExceptionSorter,不需要额外配置。

加密

druid支持数据库密码密文配置。在 druid-x.x.x.jar比如druid-1.1.10.jar中,ConfigTools类的就是完成此项功能的。

package com.lucky.spring.util;

import static com.alibaba.druid.filter.config.ConfigTools.encrypt;
import static com.alibaba.druid.filter.config.ConfigTools.genKeyPair;

/**
 * Created by zhangdd on 2020/7/20
 */
public class DruidEncryptUtil {


    public static void encryptPsd(String password) throws Exception {
        String[] arr = genKeyPair(512);
        System.out.println("privateKey:" + arr[0]);
        System.out.println("publicKey:" + arr[1]);
        System.out.println("password:" + encrypt(arr[0], password));
    }

    public static void main(String[] args) throws Exception {
        encryptPsd("12345678");
    }
}

输入结果如下:

privateKey:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAl6kpNILUwFSImzXUygX3nQLaOctfDaaj26E928XA+uQlBnXnxkR59c+wSfwDNg0GBdByIoNCw0vrxw92QHowaQIDAQABAkAaDNNoEqTqmFqSlm+Dd/ztOkUzsiwUkzAIFK0kZ9ZbAbttL+nK+4+111md/8pn1NXHqSoeh0VOZeyzggT2VNKBAiEAxknmxfhRX8xCqclSdDfcTMaF/siPgVzlSLw/XCaElrECIQDDzRtsmnR8KyoFih0NjrTcKrA5L5N43MmVHVp+1n2TOQIgGW1YnoJdTP+QfN1IKYcQRPggLq/hVyFmdZFOPq7hycECIGQcJn1sq0ohN6cFar1XzZkUKm3SqXAOUvLuwyo+uI3hAiBjh1zZQTCsx3Xsa7e2G8gRaXdB3RB8TCVOv9eqd17APw==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJepKTSC1MBUiJs11MoF950C2jnLXw2mo9uhPdvFwPrkJQZ158ZEefXPsEn8AzYNBgXQciKDQsNL68cPdkB6MGkCAwEAAQ==
password:NVExP0vZbdP7+/K2ppa/oi+oIG/TZRemZjYXyiZQSQPhbQm9FTm8UcsJtcbxUE8QT09Zo9GHAmvKTa0+IEqbIA==

配置参数,提示druid对数据库密码进行解密

得到公钥、私钥、密文之后。将公钥和密文进行如下配置。

spring.datasource.password=NVExP0vZbdP7+/K2ppa/oi+oIG/TZRemZjYXyiZQSQPhbQm9FTm8UcsJtcbxUE8QT09Zo9GHAmvKTa0+IEqbIA==
publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJepKTSC1MBUiJs11MoF950C2jnLXw2mo9uhPdvFwPrkJQZ158ZEefXPsEn8AzYNBgXQciKDQsNL68cPdkB6MGkCAwEAAQ==
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${publickey}
# 启动ConfigFilter
spring.datasource.druid.filter.config.enabled=true
  • 配置密文信息
  • 设置公钥
  • 设置durid的配置connection-properties,启用加密、引用设置的公钥信息
  • 启动ConfigFilter 让其解密

自定义扩展功能

druid支持通过Filter-Chain模式进行扩展,类似servlet的Filter,扩展十分方便。通过druid的filter可以定制连接池操作的各种环节。有两种方式可以自定义扩展功能:

  1. 集成FilterEventAdapter以方便的实现filter
  2. 自己实现filter接口,然后在项目的classpath里添加 META-INFO/druid-filter.properties配置文件,然后在文件中增加自己实现的filter。这种比较复杂。

实现自己的Filter

package com.lucky.spring.filter;

import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.filter.FilterEventAdapter;
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Properties;

/**
 * Created by zhangdd on 2020/7/20
 * <p>
 * 在连接前后打印日志
 */
@Component
public class DBConnectionFilter extends FilterEventAdapter {

    Logger logger = LoggerFactory.getLogger(DBConnectionFilter.class);

    @Override
    public void connection_connectBefore(FilterChain chain, Properties info) {
        logger.info("before connection");
    }

    @Override
    public void connection_connectAfter(ConnectionProxy connection) {
        logger.info("after connection");
    }
}

业务逻辑是在连接创建前后 各自打印一条日志。

实现好自己的Filter DBConnectionFilter之后,将其配置到filters属性值

spring.datasource.druid.filters=com.lucky.spring.filter.DBConnectionFilter

当有连接进行创建和释放的时候将会输出如下结果:

2020-07-20 19:20:56.067  INFO 49668 --- [eate-2041264753] c.l.spring.filter.DBConnectionFilter     : before connection
2020-07-20 19:20:56.321  INFO 49668 --- [eate-2041264753] c.l.spring.filter.DBConnectionFilter     : after connection

filters的配置支持别名或者全类名,druid自己也提供了很多的filter,以下是内置的filter信息:

别名 全类名
default com.alibaba.druid.filter.stat.StatFilter 用于统计监控信息
stat com.alibaba.druid.filter.stat.StatFilter
mergeStat com.alibaba.druid.filter.stat.MergeStatFilter
encoding com.alibaba.druid.filter.encoding.EncodingConvertFilter
log4j com.alibaba.druid.filter.logging.Log4jFilter
log4j2 com.alibaba.druid.filter.logging.Log4j2Filter
slf4j com.alibaba.druid.filter.logging.Slf4jLogFilter
commonlogging com.alibaba.druid.filter.logging.CommonsLogFilter
wall com.alibaba.druid.wall.WallFilter

filter更多详细的说明


以上是关于好用的连接池-druid的主要内容,如果未能解决你的问题,请参考以下文章

springboot+druid连接池及监控配置

有人熟悉阿里的 druid 的连接池么

Druid 连接池,重启Mysql数据库后,Druid会自动重新连接不,该在哪配置?

SpringBoot整合Druid数据连接池

Druid连接池的工具类以及简单代码实现

使用 druid 连接池来优化分页语句