阿里开源项目 druid 相关资料汇总

项目发起人访谈:http://www.iteye.com/magazines/90git

github主页:https://github.com/alibaba/druidgithub

druid 项目,我想我能用很短的话进行总结:首先,是个数据库链接池,这也就意味着,须要创建线程池,让connection (JDBC中的接口)与真实的线程见不是强关联。其次,我想要,可以创建监测的机制,记录有哪些sql语句,每条sql语句的执行时间,哪些sql语句我想禁止等等。其实,相似于拦截器机制,我要在connection上加上一个代理Proxy机制。在作拦截的过程当中,咱们可能要解析sql语句。sql

 

 

 

Druid是什么?有什么做用?Top

Druid首先是一个数据库链接池,但它不只仅是一个数据库链接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。

Druid的项目背景?目前的项目团队状况?开源目的?Top

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支持哪些数据库?Top

Druid支持全部JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。 

Druid针对Oracle和MySql作了特别优化,好比Oracle的PS Cache内存占用优化,MySql的ping检测优化。

Druid是如何扩展JDBC的?Top

Druid在DruidDataSourc和ProxyDriver上提供了Filter-Chain模式的扩展API,相似Serlvet的Filter,配置Filter拦截JDBC的方法调用。

为何说Druid是“最好的数据库链接池”?体如今哪些方面?这是如何实现的?Top

阿里巴巴是一个重度使用关系数据库的公司,咱们在生产环境中大量的使用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的性能如何?可否给出一些测试对比数据?Top

性能不是Druid的设计目标,可是测试数据代表,Druid性能比DBCP、C3P0、Proxool、JBoss都好。 

这里有一些测试数据: http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916539

谈谈Druid的SQL解析功能?效率如何?Top

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的扩展性如何?Top

Druid提供Filter-Chain模式的插件框架,经过编写Filter配置到DruidDataSource中就能够拦截JDBC的各类API,从而实现扩展。Druid提供了一系列内置Filter。

在SQL注入防护方面,Druid的优点是什么?实现原理是什么?Top

Druid的优点是在JDBC最低层进行拦截作判断,不会遗漏。 

Druid实现了Oracle、MySql、Postgresql、SQL-92的Parser,基于SQL语法分析实现,理解其中的SQL语义,智能、准确、误报率低。 

具体细节参考这里: http://code.alibabatech.com/wiki/display/Druid/WallFilter

目前Druid的应用(部署)状况?Top

Druid是阿里巴巴监控系统Dragoon的副产品,从Dragoon监控系统的数据来看,在阿里巴巴已经部署了600多个应用。在阿里巴巴外部也有不少Druid的用户,外部用户没有正式统计数据,但常常有反馈。

我想将其中的某个模块(好比监控模块)用到其余链接池,是否能够?模块的独立性如何?Top

能够经过DruidDriver把内置的Filter用在其余链接池中。在2011年上半年DruidDataSource不成熟的时候,咱们也是这么作的。在其余链接池中使用内置的Filter,须要修改jdbc-url,使用DruidDriver做为一个ProxyDriver。

我想在项目中使用,应该注意哪些事项?可否用于商业项目?Top

Druid是一个开源项目,基于Apache 2.0协议,你能够免费自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0。

配置是否复杂?可否给出一个典型的配置实例?Top

为了方便你们迁移,Druid的配置和DBCP是基本一致的,若是你原来是使用DBCP,迁移是十分方便的,只须要把corg.apache.commons.dbcp.BasicDataSource修改成om.alibaba.druid.pool.DruidDataSource就行了。 

如下是一个参考配置: 

Xml代码 
  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">   
  2.     <property name="url" value="${jdbc_url}" />  
  3.     <property name="username" value="${jdbc_user}" />  
  4.     <property name="password" value="${jdbc_password}" />  
  5.        
  6.     <property name="filters" value="stat" />  
  7.    
  8.     <property name="maxActive" value="20" />  
  9.     <property name="initialSize" value="1" />  
  10.     <property name="maxWait" value="60000" />  
  11.     <property name="minIdle" value="1" />  
  12.    
  13.     <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  14.     <property name="minEvictableIdleTimeMillis" value="300000" />  
  15.    
  16.     <property name="validationQuery" value="SELECT 'x'" />  
  17.     <property name="testWhileIdle" value="true" />  
  18.     <property name="testOnBorrow" value="false" />  
  19.     <property name="testOnReturn" value="false" />  
  20.        
  21.     <property name="poolPreparedStatements" value="true" />  
  22.     <property name="maxPoolPreparedStatementPerConnectionSize" value="50" />  
  23. </bean>  

在上面的配置中,一般你须要配置url、username、password、maxActive这几项。 

在DruidDataSource中,你能够不配置DriverClass,它根据url自动识别。Druid可以自动识别20多中url,常见的JDBC Driver都包括了。

我目前使用其余链接池(DBCP/C3P0/Proxool等),如何迁移到Druid?Top

从DBCP迁移最方便,把org.apache.commons.dbcp.BasicDataSource修改成om.alibaba.druid.pool.DruidDataSource就行了。 

Druid网站上提供了 Druid/DBCP/C3P0/JBoss/WebLogic的参数对照表,经过这个对照表来迁移你目前的配置。

其余开发者如何反馈问题、提交bug?Top

Druid源码托管在github.com上,项目地址是 https://github.com/AlibabaTech/druid。  你能够在github上提交patch和issue(包括bug和新特性)。你也能够加入咱们的QQ群92748305,和开发者以及其余用户一块儿交流。
相关文章
相关标签/搜索