阿里巴巴数据库连接池druid

Druid是什么?

 Druid首先是一个数据库连接池,并且是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池


Druid可以做什么? 

1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 

2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 

3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 

4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 


下载

可以从 http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的jar包。如果想使用最新的源码编译,也可以从 https://github.com/alibaba/druid 下载源码,然后使用maven命令行,或者导入到IDEA中进行编译获得。


Druid的配置项详解 

官方详解说明:

https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
以下是说明,以上面官方链接为准

配置缺省值说明
name无配置这个属性的意义在于,如果存在多个数据源,监控的时候 
可以通过名字来区分开来。如果没有配置,将会生成一个名字, 
格式是:"DataSource-" + System.identityHashCode(this)
jdbcUrl无连接数据库的url,不同数据库不一样。例如: 
mysql : jdbc:mysql://10.20.153.104:3306/druid2  
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username无连接数据库的用户名
password无连接数据库的密码。如果你不希望密码直接写在配置文件中, 
可以使用ConfigFilter。
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive8最大连接池数量
maxIdle8已经不再使用,配置了也没效果
minIdle无最小连接池数量
maxWait无获取连接时最大等待时间,单位毫秒。配置了maxWait之后, 
缺省启用公平锁,并发效率会有所下降, 
如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。 
PSCache对支持游标的数据库性能提升巨大,比如说oracle。 
在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录, 
该应该是支持PSCache。
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时, 
poolPreparedStatements自动触发修改为true。 
在Druid中,不会存在Oracle下PSCache占用内存过多的问题, 
可以把这个数值配置大一些,比如说100
validationQuery用来检测连接是否有效的sql,要求是一个查询语句。 
如果validationQuery为null,testOnBorrow、testOnReturn、 
testWhileIdle都不会其作用。
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。 
申请连接的时候检测,如果空闲时间大于 
timeBetweenEvictionRunsMillis, 
执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis无有两个含义: 
1) Destroy线程会检测连接的间隔时间 
2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun无不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis无 一个连接在池中最小的生存时间,单位是毫秒
connectionInitSqls无物理连接初始化的时候执行的sql
exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
filters无属性类型是字符串,通过别名的方式配置扩展插件, 
常用的插件有: 
监控统计用的filter:stat  
日志用的filter:log4j 
防御sql注入的filter:wall
proxyFilters无类型是List<com.alibaba.druid.filter.Filter>, 
如果同时配置了filters和proxyFilters, 
是组合关系,并非替换关系




启用内置监控

如果要使用Druid的内置监控功能,需要配置数据源时加上<property name="filters" value="stat" />,上面已经有了。

还需要在web.xml中加上以下代码

<!-- 启用Web监控统计功能需要在Web应用的web.xml中加入这个Servlet声明 -->  
  <servlet>  
      <servlet-name>DruidStatView</servlet-name>  
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
      <init-param>    
        <!-- 是否允许清空统计数据,不写时默认true -->  
        <param-name>resetEnable</param-name>    
        <param-value>true</param-value>    
        </init-param>    
        <init-param>    
        <!-- 用户名,用户名和密码可以不写,不写时不需要输入,直接登录 -->  
        <param-name>loginUsername</param-name>    
        <param-value>druid</param-value>    
        </init-param>    
        <init-param>    
        <!-- 密码 -->  
        <param-name>loginPassword</param-name>    
        <param-value>123456</param-value>    
      </init-param>    
  </servlet>  
  <servlet-mapping>  
      <servlet-name>DruidStatView</servlet-name>  
      <url-pattern>/druid/*</url-pattern>  
  </servlet-mapping>

启动项目后在浏览器输入:http://ip:port/项目名/druid/

或

http://ip:port/项目名/druid/index.html

即可访问。



原文出处:/show_1C7PdWZqEVU.html