好用的连接池-druid
druid连接池是阿里巴巴的数据库连接池项目。它的一个亮点强大的监控功能以及防SQL注入,同时不影响性能。这里是它的GitHub地址。感觉druid扩展的功能还是很实用的。
实用的功能
- 详细的监控
- ExceptionSorter,针对主流数据库的返回码都有支持
- SQL防注入
- 内置加密配置
- 可自定义扩展
Springboot中druid的使用
在Springboot项目中使用druid作为连接池还是很方便的。
- 在依赖文件中添加
druid-spring-boot-starter依赖配置。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
- 在application.properties中指定DataSource的类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
- 启动项目。打开服务地址(
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可以定制连接池操作的各种环节。有两种方式可以自定义扩展功能:
- 集成FilterEventAdapter以方便的实现filter
- 自己实现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 |
好用的连接池-druid的更多相关文章
- 连接池 druid(阿里巴巴的框架)
引用自:http://blog.163.com/hongwei_benbear/blog/static/1183952912013518405588/ 说的是现在最好的连接池 注: 属性跟 d ...
- 阿里巴巴连接池Druid简单使用
Druid参考:https://github.com/alibaba/druid 偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的. Druid集连接 ...
- 黑马学习连接池 druid JdbcTemplate c3p0 池技术
package cn.itcast.jdbctemplate; import org.junit.Test; import org.springframework.jdbc.core.BeanProp ...
- 数据库阿里连接池 Druid配置详解以及web监控统计
java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...
- 数据库阿里连接池 druid配置详解
http://blog.csdn.net/hj7jay/article/details/51686418 http://lj6684.iteye.com/blog/1770093 http://www ...
- SpringBoot整合Druid数据连接池
SpringBoot整合Druid数据连接池 Druid是什么? Druid是Alibaba开源的的数据库连接池.Druid能够提供强大的监控和扩展功能. 在哪里下载druid maven中央仓库: ...
- DBCP、c3p0、Druid三大连接池区别
DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...
- Java开发笔记(一百五十一)Druid连接池的用法
C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...
随机推荐
- 基层教师 - CMD命令之net命令与IPC连接
1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连接: net use \ ...
- 数据分析07 /matplotlib绘图
数据分析07 /matplotlib绘图 目录 数据分析07 /matplotlib绘图 1. 绘制线性图:plt.plot() 2. 绘制柱状图:plt.bar() 3. 绘制直方图:plt.his ...
- sanri-tools-maven 企业软件开发工具集
9420 开发工具包 sanri-tools-maven 是一个开源的用于企业开发的工具包,重点想解决项目开发中一些比较麻烦的问题 根据表和模板生成相应代码:一些身份证,企业代码,车架号的验证与生成: ...
- 关于git,无论是命令使用还是深入学习,看我总结就够了
周五了,又是划水的一下午,无意中在某号上发现了这样一张图,说的内容很简单,就是我们日常离不开的git,可能因为最近github宕机,网传服务器被盗的新闻把,让我瞬间产生了兴趣,就点进去看一下 大家能看 ...
- linux : 新服务器部署项目要做的事
环境:阿里云服务器两台,一台web,一台db,系统centos7. 用户用外网访问web server ,web server 再去访问db server. 1 阿里云控制台进入系统2 SSH进入系统 ...
- 谷歌浏览器又隐藏的HTTPS和WWW前缀
谷歌工程师 Emily Schechter 曾在 Chromium 反馈页面中提到:Chrome 团队一直将简易性.可用性.安全性作为衡量 UI 的标准.为了让 URL 能更好地被用户理解.移除那些容 ...
- 图文详解压力测试工具JMeter的安装与使用
压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案.压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性 ...
- Pytorch实现基于卷积神经网络的面部表情识别(详细步骤)
文章目录 一.项目背景 二.数据处理 1.标签与特征分离 2.数据可视化 3.训练集和测试集 三.模型搭建 四.模型训练 五.完整代码 一.项目背景数据集cnn_train.csv包含人类面部表情的图 ...
- idea 导入eclipse play1.2.7项目
1.play eclipsify #myapp 转为eclipse目录结构 2.导入eclipse,一路next. 3.新增个Application -Xms1536m-Xmx2048m-Xdebug ...
- spring +ActiveMQ 实战 topic selecter指定接收
spring +ActiveMQ 实战 topic selecter指定接收 queue:点对点模式,一个消息只能由一个消费者接受 topic:一对多,发布/订阅模式,需要消费者都在线(可能会导致信息 ...