本文是由转载而来.git
Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库链接池、插件框架和 SQL解析 器组成。该项目主要是为了扩展JDBC的一些限制,可让程序员实现一些特殊的需求,好比向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注 入检查、SQL翻译等,程序员能够经过定制来实现本身须要的功能。
程序员
该项目在阿里巴巴内部获得了普遍的部署,在外部也有大量的用户群。为了使你们更好地了解和使用Druid,咱们采访了Druid项目的主要负责人——温少(博客)。github
问:温少是ITeye的名人了,为了照顾新会员,先来个自我介绍吧! sql
温少:我2001年毕业于深圳大学,毕业后到金蝶软件研发中心工做9年,工做内容包括工做流引擎、多数据库支持引擎、短信网网关等。
2010年3月加入阿里巴巴至今,主要的工做是设计和实现阿里巴巴应用监控系统Dragoon,Druid和Fastjson都是监控系统实现的副产品。数据库
问:Druid是什么?有什么做用? apache
温少:Druid首先是一个数据库链接池,但它不只仅是一个数据库链接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。json
问: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的工做状况。
其次,方便扩展。Druid提供了Filter-Chain模式的扩展API,能够本身编写Filter拦截JDBC中的任何方法,能够在上面作任何事情,好比说性能监控、SQL审计、用户名密码加密、日志等等。
第三,Druid集合了开源和商业数据库链接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。
问: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,和开发者以及其余用户一块儿交流。