druid解析-过滤器详解

news2024/12/26 16:14:42

druid支持过滤器,可以在获取连接或者调用连接对象的方法时,先调用过滤器,之后再执行底层方法,比如DruidDataSource的getConnection()方法:

    public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
        init();
        //先执行过滤器
        if (filters.size() > 0) {
            FilterChainImpl filterChain = new FilterChainImpl(this);
            return filterChain.dataSource_connect(this, maxWaitMillis);
        } else {
            return getConnectionDirect(maxWaitMillis);
        }
    }

除了在连接对象之上加过滤器,还可以对ResultSet、Statement、PreparedStatement、CallableStatement、ResultSetMetaData对象上加过滤器。通过FilterChainImpl类的方法前缀可以很明显的看出哪些可以加过滤器的对象。

目录

  • 一、如何设置过滤器
  • 二、druid提供了哪些过滤器
    • 1、StatFilter
    • 2、EncodingConvertFilter
    • 3、ConfigFilter
    • 4、日志过滤器
  • 三、自定义过滤器

一、如何设置过滤器

我们可以在环境变量或者启动参数(通过-D设置)中设置参数“druid.filters”的值,格式为“过滤器名A,过滤器名B,…”(中间以逗号分隔),除了通过参数“druid.filters”设置之外,还可以在连接url中通过“filters=”设置过滤器,值的格式也是一样的。
DruidDataSource启动的时候,会读取参数值,然后进行解析得到过滤器名,之后根据名字查找过滤器。那么过滤器名和过滤器之间的对应关系在哪维护?我们通过FilterManager.loadFilterConfig()方法看到,druid启动的时候,加载了META-INF/druid-filter.properties文件,这个文件里面就存放了过滤器名与过滤器之间的对应关系。该文件的内容如下图:
请添加图片描述
上图中druid.filters后面的就是过滤器名,等号之后的内容就是过滤器的全限定类名。启动时,FilterManager首先解析该文件,将名字与类名放入一个Map对象中,之后druid解析我们设置的过滤器参数,得到过滤器名字,然后根据名字从Map中得到类名,之后druid创建过滤器对象,最后将过滤器对象放入到DruidAbstractDataSource.filters集合中。
当调用一些对象的方法时,druid创建FilterChainImpl对象,该对象持有所有的过滤器,FilterChainImpl会先遍历所有的过滤器,最后调用底层方法,比如上面的getConnection()方法。

二、druid提供了哪些过滤器

通过上面的图,我们就可以看到druid提供了哪些过滤器。下面对部分过滤器进行介绍。

1、StatFilter

该过滤器用于统计监控信息,比如可以统计事务提交次数,SQL语句执行次数,总SQL执行时间等。
除了统计功能之外,它还具备慢SQL监控功能,这要求我们设置slowSqlMillis和logSlowSql两个属性,slowSqlMillis表示毫秒数,如果SQL的执行时间大于slowSqlMillis,则表示SQL执行慢,logSlowSql表示是否打印慢SQL,默认是false,不打印。执行SQL的时候,StatFilter计算SQL的执行时间,如果时间大于slowSqlMillis并且logSlowSql=true,那么StatFilter会将SQL语句、参数及执行时间一起打印出来,日志以“slow sql ”开头。

其他信息大家可以参考文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

2、EncodingConvertFilter

该过滤器用于对SQL语句、数据库返回值进行编码转换。我们可以设置属性“ali.charset.converter”的值,当执行SQL语句时,该过滤器将SQL语句进行编码,编码为指定的格式,数据库返回值也是一样,不过这要求返回值必须是String或者Reader对象。

3、ConfigFilter

从名字上能够看出来,该过滤器与配置有关。其作用有:

  • 从配置文件中读取配置
  • 从远程http文件中读取配置
  • 为数据库密码提供加密功能

下面详细分析下该类的init()方法,当druid加载完过滤器对象之后,就会调用各个过滤器的init()方法,这就意味着当执行init()方法时,druid还没有创建数据库连接:

    public void init(DataSourceProxy dataSourceProxy) {
  		
        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
        Properties connectionProperties = dataSource.getConnectProperties();
		//获得属性druid.config.file的值,该属性值表示配置文件的位置,
		//该值如果以file://开头,表示文件从本地磁盘加载;
		//如果以http://或者https://开头,表示从网路加载;
		//如果以classpath:开头,表示从类路径加载;
		//如果什么都不配置,那么表示从本地磁盘加载
        Properties configFileProperties = loadPropertyFromConfigFile(connectionProperties);

        // 判断是否需要解密,如果需要就进行解密行动
        //获取config.decrypt属性的值,如果配置了config.decrypt=true,那么表示密码需要解密
        boolean decrypt = isDecrypt(connectionProperties, configFileProperties);

        if (configFileProperties == null) {
            if (decrypt) {
                decrypt(dataSource, null);//对密码解密
            }
            return;
        }

        if (decrypt) {
            decrypt(dataSource, configFileProperties);
        }

        try {
        	//将密码和配置设置到数据源对象中,之后数据源对象就可以创建数据库连接了
            DruidDataSourceFactory.config(dataSource, configFileProperties);
        } catch (SQLException e) {
            throw new IllegalArgumentException("Config DataSource error.", e);
        }
    }

其他信息大家可以参考文档:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

4、日志过滤器

druid提供了四种日志过滤器,它们都继承自LogFilter,这四个过滤器分别是Log4jFilter、Log4j2Filter、CommonsLogFilter、Slf4jLogFilter,从过滤器名字上就可以看出,它们分别对应了不同的日志工具。
该类的作用是:

  • 打印执行的SQL语句;
  • 打印SQL语句的执行时间。

其他信息大家可以参考文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

三、自定义过滤器

我们也可以自定义过滤器。
一般过滤器都是继承自FilterAdapter,之后改写其中的部分方法,然后将过滤器名与类名配置到类路径下文件META-INF/druid-filter.properties中,之后在参数“druid.filters”上增加我们自定义的过滤器名就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全一哥的奇安信发布了全球高级可持续威胁年度报告 值得学习

声明 本文是学习全球高级持续性威胁 APT 2021年度报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 中国境内高级持续性威胁综述 基于中国境内海量DNS域名解析和奇安信威胁情报中心失陷检测(IOC)库的碰撞分析&…

9_1、Java基本语法之常用类String、StringBuffer、StringBuilder的使用

一、String的使用及常用方法 1、概述 String:表示字符串,使用""引起来。 1.1、String类是声明为final的,不可被继承。 1.2、String类实现了Serializable接口,表示字符串支持序列化。 …

【王道操作系统】2.1.3 原语实现对进程的控制

原语实现对进程的控制 文章目录原语实现对进程的控制1.什么是进程控制2.原语实现对进程的控制3.回忆进程的组织4.进程控制大致图解5.进程控制原语的相同点6.进程控制的五种原语1.什么是进程控制 2.原语实现对进程的控制 3.回忆进程的组织 4.进程控制大致图解 这里说明一下调度和…

MySQL【AUTO_INCREMENT 】自增列

使用案例场景再现: 创建一个为test的数据库,为数据库test创建一个数据表student ,其中包含的字段有 id name sex,admission_time,其中要求student表中的人员id必须连续排列。 create database test use test cr…

SCI论文解读复现【NO.1】基于Transformer-YOLOv5的侧扫声纳图像水下海洋目标实时检测

此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮助…

三旗舰焕新发布引领品牌向上 长城汽车登陆2022广州车展

近日,长城汽车携哈弗、魏牌、欧拉、坦克、长城炮以及沙龙六大品牌,登陆第二十届广州国际汽车展览会(以下简称“2022广州车展”)。魏牌全新旗舰蓝山DHT-PHEV、坦克500 PHEV长续航版、大型高性能豪华皮卡山海炮等车型联袂而至&#…

创建静态库存文件 ansible(3)

目录 创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: (1)node1是dev主机组的成员 (2)node2是test主机组的成员 (3)node1和node2是prod主机组的成员 (4&am…

【Qt】控件——QPlainTextEdit使用简单介绍:常用方法及信号、逐行读取编辑框的内容、使用自带的快捷菜单、作为日志显示窗口

Qt控件-QPlainTextEdit使用 参考链接: https://blog.csdn.net/seniorwizard/article/details/109726147; https://blog.csdn.net/seniorwizard/article/details/109726147 文章目录Qt控件-QPlainTextEdit使用QPlainTextEdit控件简单介绍1. 逐行读取文本编辑框的内容…

【PCB专题】什么是金属化孔(PTH)和非金属化孔(NPTH)

计出来的,并不是放在那里好看的,每个不同的孔洞都有其目的。一般来说孔洞越多,PCB的成本也越高。 PCB中的孔类型大体上可以被区分为PTH(Plating Through Hole)电镀导通孔,和NPTH(None Plating Through Hole)非电镀导通孔两大类。这里说的通孔是指从PCB的一面直接贯穿到…

Spark数据倾斜性能调优

目录 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 某个task执行特别慢的情况 某个task莫名其妙内存溢出的情况 查看导致数据倾斜的key的数据分布情况 知识拓展 coalesce 和 repartition 的区别 数据倾斜的解决方案 解决方案一&am…

【哈工大大一年度项目经验与感想】立项篇 中(2021.9.17~2021.11.17)

第四步:立项报告书写 立项报告的目的在于向答辩老师或者投资方阐述你的项目是什么?做什么的?解决什么问题?打算怎么解决这些问题?有什么创新点、特色?目标?所以一篇立项报告正文需要包括以下内容…

21级数据结构考前模拟题

说明: 此试卷为21级数据结构考前模拟题,老师并未给出标准答案,故以下所有答案均为博主给出,并只供参考,不保证其正确性!!! 只更新了部分,还在写题中!&#xf…

同步+异步日志系统(C++实现)

对于一个服务器而言,不论是在调试中还是在运行中,都需要通过打日志的方式来记录程序的运行情况。本文设计的日志系统实现了同步与异步两种功能,原理见下图: 同步日志:日志写入函数与工作线程串行执行,由于涉…

人脸识别与美颜算法实战-基于机器学习的人脸识别

机器学习根据输出的类型一般分为两类,分类和回归。分类的输出一般是离散值,回归输出的值一般是连续的。比如,人脸识别这种就属于分类问题,房价预测一般是一个回归问题。 鸢尾花分类 # -*- coding: UTF-8 -*- # 导入数据集 from sklearn.datasets import load_iris iris =…

InnoDB事务原理理解(redo log,undo log,锁,MVCC的理解)

目录事务事务的四大特性ACID事务相关SQL语句事务原理事务如何解决隔离性隔离性总结事务如何解决原子性、一致性、持久性redo log 重做日志CheckPoint 检查点机制Double Writer 双写磁盘undo log 回滚日志锁表级锁表读锁、表写锁元数据锁MDL意向锁行级锁行读锁,行写锁…

coremail邮件安全网关产品详细学习笔记(上)

声明 本文是学习中国企业邮箱安全性研究报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 钓鱼邮件 钓鱼邮件的规模 在本章内容中,钓鱼邮件是指含有恶意欺诈信息的邮件,包括OA钓鱼邮件、鱼叉邮件、钓鲸邮件、CEO仿…

PHP代码审计

1. "" 与 “” 在进行比较的时候,会先将字符串类型转化成相同,如果整型跟字符型比较字符或从左往右提取整型直到遇到字符结束,再比较。 在进行比较的时候,会先判断两种字符串的类型是否相等,当等号两边类…

nodejs调用matlab的.m文件

1、问题的提出: 在一些web服务中,后台采用nodejs轻量化服务器接口,而matlab的.m文件编写了算法模块,两者调用时,官方没有提供相应的文档(当然也可能我没找到)。因此,本文提出了matl…

上岸学姐的浙大MPA复试流程和内容经验介绍

管理类考研笔试落下帷幕,大家有没有因为周末不上课,平时不刷题而感到生活好像缺了些啥呢?没关系,复试已经可以开始准备啦,尤其是对于我们报考MPA项目的同学们来说。 预计二月份下旬笔试成绩会先出来了&#xff0c…

逻辑回归-sklearn

1.概述 逻辑回归,是一种线性分类器。其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法。 最小二乘法就是用来求解线性回归中参数的数学方法。 2.sklearn中的逻辑回归 (1)逻辑回归分类器(又叫l…