阿里巴巴开源项目 Druid 负责人温少访谈
本文是由转载而来.
Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析 器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注 入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能。
该项目在阿里巴巴内部得到了广泛的部署,在外部也有大量的用户群。为了使大家更好地了解和使用Druid,我们采访了Druid项目的主要负责人——温少(博客)。
问:温少是ITeye的名人了,为了照顾新会员,先来个自我介绍吧!
温少:我2001年毕业于深圳大学,毕业后到金蝶软件研发中心工作9年,工作内容包括工作流引擎、多数据库支持引擎、短信网网关等。
2010年3月加入阿里巴巴至今,主要的工作是设计和实现阿里巴巴应用监控系统Dragoon,Druid和Fastjson都是监控系统实现的副产品。
问:Druid是什么?有什么作用?
温少:Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
问:Druid的项目背景?目前的项目团队情况?开源目的?
温少:2010年开始,我负责设计一个叫做Dragoon的监控系统,需要一些 监控组件,监控应用程序的运行情况,包括Web URI、Spring、JDBC等。为了监控SQL执行情况,我做了一个Filter-Chain模式的ProxyDriver,缺省提供 StatFilter。当时我还做了一个SQL Parser。老板说,不如我们来一个更大的计划,把连接池、SQL Parser、Proxy Driver合起来做一个项目,命名为Druid,于是Druid就诞生了。
2011年2月春节期间,我完成了连接池(DruidDataSource)的第一个版本,4月开始在生产环境测试,2012年第一季度开始大规模实施。
提交过代码的开发者有5个人,主要代码是我维护,有一人专门负责内部实施。
通过开源,希望有更多使用场景,更多的反馈,更多人参与其中,共同打造最好的数据库连接池。
问:Druid支持哪些数据库?
温少:Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。
问:Druid是如何扩展JDBC的?
温少:Druid在DruidDataSourc和ProxyDriver上提供了Filter-Chain模式的扩展API,类似Serlvet的Filter,配置Filter拦截JDBC的方法调用。
问:为什么说Druid是“最好的数据库连接池”?体现在哪些方面?这是如何实现的?
温少:阿里巴巴是一个重度使用关系数据库的公司,我们在生产环境中大量的使用Druid,通过长期在极高负载的生产环境中实际使用、修改和完善,让Druid逐步发展成最好的数据库连接池。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势。
首先,强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
- 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息。
- SQL执行的耗时区间 分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100 次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况。
- 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等
其次,方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
- Druid内置提供了用于监控的StatFilter、日志输出的Log系列Filter、防御SQL注入攻击的WallFilter。
- 阿里巴巴内部实现了用于数据库密码加密的CirceFilter,以及和Web、Spring关联监控的DragoonStatFilter。
第三,Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。
- ExceptionSorter。当一个连接产生不可恢复的异常时,例如Oracle error_code_28 session has been killed,必须立刻从连接池中逐出,否则会产生大量错误。目前只有Druid和JBoss DataSource实现了ExceptionSorter。
- PSCache内存占用优化对于支持游标的数据库(Oracle、 SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL执行性能。一个PreparedStatement对应服务器一个游 标,如果PreparedStatement被缓存起来重复执行,PreparedStatement没有被关闭,服务器端的游标就不会被关闭,性能提高 非常显著。在类似“SELECT * FROM T WHERE ID = ?”这样的场景,性能可能是一个数量级的提升。但在Oracle JDBC Driver中,其他的数据库连接池(DBCP、JBossDataSource)会占用内存过多,极端情况可能大于1G。Druid调用 OracleDriver提供管理PSCache内部API。
- LRU是一个性能关键指标,特别Oracle,每个 Connection对应数据库端的一个进程,如果数据库连接池遵从LRU,有助于数据库服务器优化,这是重要的指标。Druid、DBCP、 Proxool、JBoss是遵守LRU的。BoneCP、C3P0则不是。BoneCP在mock环境下性能可能还好,但在真实环境中则就不好了。
问:Druid的性能如何?能否给出一些测试对比数据?
温少:性能不是Druid的设计目标,但是测试数据表明,Druid性能比DBCP、C3P0、Proxool、JBoss都好。
这里有一些测试数据:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916539
问:谈谈Druid的SQL解析功能?效率如何?
温少:Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。
简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
问:Druid的扩展性如何?
温少:Druid提供Filter-Chain模式的插件框架,通过编写Filter配置到DruidDataSource中就可以拦截JDBC的各种API,从而实现扩展。Druid提供了一系列内置Filter。
问:在SQL注入防御方面,Druid的优势是什么?实现原理是什么?
温少:Druid的优势是在JDBC最低层进行拦截做判断,不会遗漏。
Druid实现了Oracle、MySql、Postgresql、SQL-92的Parser,基于SQL语法分析实现,理解其中的SQL语义,智能、准确、误报率低。
具体细节参考这里:http://code.alibabatech.com/wiki/display/Druid/WallFilter
问:目前Druid的应用(部署)情况?
温少:Druid是阿里巴巴监控系统Dragoon的副产品,从Dragoon监控系统的数据来看,在阿里巴巴已经部署了600多个应用。在阿里巴巴外部也有很多Druid的用户,外部用户没有正式统计数据,但经常有反馈。
问:我想将其中的某个模块(比如监控模块)用到其他连接池,是否可以?模块的独立性如何?
温少:可以通过DruidDriver把内置的Filter用在其他连接池中。 在2011年上半年DruidDataSource不成熟的时候,我们也是这么做的。在其他连接池中使用内置的Filter,需要修改jdbc-url, 使用DruidDriver作为一个ProxyDriver。
问:我想在项目中使用,应该注意哪些事项?能否用于商业项目?
温少:Druid是一个开源项目,基于Apache 2.0协议,你可以免费自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0。
问:配置是否复杂?能否给出一个典型的配置实例?
温少:为了方便大家迁移,Druid的配置和DBCP是基本一致的,如果你原来 是使用DBCP,迁移是十分方便的,只需要把corg.apache.commons.dbcp.BasicDataSource修改为 om.alibaba.druid.pool.DruidDataSource就好了。
以下是一个参考配置:
1 <bean <span style="color:#FF0000;">id</span>="dataSource" <span style="color:#FF0000;">class</span>="com.alibaba.druid.pool.DruidDataSource" <span style="color:#FF0000;">init-method</span>="init" <span style="color:#FF0000;">destroy-method</span>="close"> 2 <property <span style="color:#FF0000;">name</span>="url" <span style="color:#FF0000;">value</span>="${jdbc_url}" /> 3 <property <span style="color:#FF0000;">name</span>="username" <span style="color:#FF0000;">value</span>="${jdbc_user}" /> 4 <property <span style="color:#FF0000;">name</span>="password" <span style="color:#FF0000;">value</span>="${jdbc_password}" /> 5 6 <property <span style="color:#FF0000;">name</span>="filters" <span style="color:#FF0000;">value</span>="stat" /> 7 8 <property <span style="color:#FF0000;">name</span>="maxActive" <span style="color:#FF0000;">value</span>="20" /> 9 <property <span style="color:#FF0000;">name</span>="initialSize" <span style="color:#FF0000;">value</span>="1" /> 10 <property <span style="color:#FF0000;">name</span>="maxWait" <span style="color:#FF0000;">value</span>="60000" /> 11 <property <span style="color:#FF0000;">name</span>="minIdle" value="1" /> 12 13 <property <span style="color:#FF0000;">name</span>="timeBetweenEvictionRunsMillis" <span style="color:#FF0000;">value</span>="60000" /> 14 <property <span style="color:#FF0000;">name</span>="minEvictableIdleTimeMillis" <span style="color:#FF0000;">value</span>="300000" /> 15 16 <property <span style="color:#FF0000;">name</span>="validationQuery" <span style="color:#FF0000;">value</span>="SELECT 'x'" /> 17 <property <span style="color:#FF0000;">name</span>="testWhileIdle" <span style="color:#FF0000;">value</span>="true" /> 18 <property <span style="color:#FF0000;">name</span>="testOnBorrow" <span style="color:#FF0000;">value</span>="false" /> 19 <property <span style="color:#FF0000;">name</span>="testOnReturn" <span style="color:#FF0000;">value</span>="false" /> 20 21 <property <span style="color:#FF0000;">name</span>="poolPreparedStatements" <span style="color:#FF0000;">value</span>="true" /> 22 <property <span style="color:#FF0000;">name</span>="maxPoolPreparedStatementPerConnectionSize" <span style="color:#FF0000;">value</span>="50" /> 23 </bean>
在上面的配置中,通常你需要配置url、username、password,maxActive这三项。
在DruidDataSource中,你可以不配置DriverClass,它根据url自动识别。Druid能够自动识别20多中url,常见的JDBC Driver都包括了。
问:我目前使用其他连接池(DBCP/C3P0/Proxool等),如何迁移到Druid?
温少:从DBCP迁移最方便,把org.apache.commons.dbcp.BasicDataSource修改为om.alibaba.druid.pool.DruidDataSource就好了。
Druid网站上提供了Druid/DBCP/C3P0/JBoss/WebLogic的参数对照表,通过这个对照表来迁移你目前的配置。
问:其他开发者如何反馈问题、提交bug?
温少:Druid源码托管在github.com上,项目地址是https://github.com/AlibabaTech/druid。
你可以在github上提交patch和issue(包括bug和新特性)。你也可以加入我们的QQ群92748305,和开发者以及其他用户一起交流。
转载于:https://www.cnblogs.com/zjushuiping/archive/2012/08/01/2619055.html
阿里巴巴开源项目 Druid 负责人温少访谈相关推荐
- 阿里巴巴开源项目 Druid
Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和SQL解析器组成.该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计SQL ...
- 阿里巴巴开源项目 -- Druid
Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和SQL解析器组成.该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计SQL ...
- 9月27日科技资讯|余承东吐槽苹果续航;贾扬清担任阿里巴巴开源技术委员会负责人;React Native 0.61.0 发布
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...
- 贾扬清出任阿里巴巴开源技术委员会负责人
9月27日,杭州云栖大会上,阿里巴巴副总裁.阿里云智能计算平台事业部总经理贾扬清正式出任阿里巴巴开源技术委员会负责人.阿里巴巴开源技术委员会让开源正式升级成为阿里技术战略之一.(澎湃)
- 阿里云开源项目 OAM 负责人张磊入选「中国开源先锋 33 人」
来源|阿里巴巴云原生公众号 2020 年 12 月 23 日,由 SegmentFault 思否发起的第二届"中国技术先锋"年度评选结果揭晓,CNCF 应用交付领域小组 Co-ch ...
- 阿里巴巴开源项目汇总-(JAVA)
来源:https://segmentfault.com/a/1190000017346799 1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud ...
- 阿里巴巴开源项目集锦
1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务的 ...
- 阿里巴巴开源项目nginx_concat_module企业部署实例
公司的前端开发工程师今天找我,让我给他搞下淘宝的一个开源项目 nginx_concat_module 模块,将该模块添加到线上的nginx上去. 简介 nginx_concat_module 是淘宝研 ...
- 阿里巴巴的开源项目Druid(关于数据库连接)
原文地址:http://www.iteye.com/magazines/90 文章简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系 ...
最新文章
- Idea实体类上加@Data注解但get/set方法不生效
- 【Python学习系列二十九】scikit-learn库实现天池平台智慧交通预测赛
- 【学习笔记】37、用正则表达式解析和提取数据
- Linux设备驱动之UART驱动结构
- C语言的main函数,究竟有几种写法?
- 使用DataTable更新数据库
- jquery ui autocomplete输入中文不自动完成的问题
- java对象内存模型_Java对象的内存模型
- django-学生列表页的制作
- 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理
- 创建者模式 -- 工厂模式
- C语言如何使用三角函数
- 永洪科技怎么样_永洪科技面试总结--多位分享经验
- 第四十六讲 设备驱动kobject
- oracle查看表sql语句,oracle查看创造表的sql语句
- 面向NLP的AI产品方法论——如何设计多轮语音技能
- 爆笑!史上最强的中国式英语
- Oracle 查锁 和杀锁
- visio 2019如何绘制圆角矩形
- 她力量系列三丨把握当下,坚持热爱,与食物图像识别结缘的科研之路
热门文章
- AI给AI论文写了个摘要,网友戏称为“摘要通过图灵测试”,推特点赞上千
- 最高5000倍加速模拟物理世界,育碧在修复bug上又进一步
- 【报告下载】想要评测 Kylin和Vertica的性能?这份基准测试白皮书已经替你做到了...
- HDFS集群安装部署
- 如何让自己的开源库支持cocoapods?
- 【译】码农生涯十六条不要
- JAVA中的枚举小结
- C#部署安装,将用户安装路径记录下写入注册表,并启动
- [Bug]当IDENTITY_INSERT设置为OFF时,不能为表“xx”中的标识列插入显示的值
- Linux文件系统只读Read-only file system