1、druid是什么
Druid是一个高效的数据查询系统,主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到Druid后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入Druid,外部系统就可以对该事实进行查询。
源码托管在github上,源代码仓库地址是https://github.com/alibaba/druid。同时每次Druid发布正式版本和快照的时候,都会把源码打包,你可以从上面的下载地址中找到相关版本的源码。
2、druid在项目中的应用(Spring框架中)
配置
| 缺省值
| 说明
|
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。详细看这里:
https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter | |
driverClassName
| 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
| |
initialSize
| 0
| 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
|
maxActive
| 8
| 最大连接池数量
|
maxIdle
| 8
| 已经不再使用,配置了也没效果
|
minIdle
| 最小连接池数量
| |
maxWait
| 获取连接时最大等待时间,单位毫秒。配置了maxWait之后, 缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
| |
poolPreparedStatements
| false
| 是否缓存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都不会其作用。
| |
testOnBorrow
| true
| 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
|
testOnReturn
| false
| 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
|
testWhileIdle
| false
| 建议配置为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,是组合关系,并非替换关系
|
(1)所使用的jar包:
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
(2)在applicationContext.xml中的配置
< bean name = "transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name = "dataSource" ref = "dataSource" ></ property >
</ bean >
< bean id = "propertyConfigurer" class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
< property name = "locations" >
< list >
< value > /WEB-INF/classes/dbconfig.properties </ value >
</ list >
</ property >
</ bean >
<!-- 阿里 druid 数据库连接池 -->
< bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource"destroy-method = "close" >
<!-- 数据库基本信息配置 -->
< property name = "url" value = "${url}" />
< property name = "username" value = "${username}" />
< property name = "password" value = "${password}" />
< property name = "driverClassName" value = "${driverClassName}" />
< property name = "filters" value = "${filters}" />
<!-- 最大并发连接数 -->
< property name = "maxActive" value = "${maxActive}" />
<!-- 初始化连接数量 -->
< property name = "initialSize" value = "${initialSize}" />
<!-- 配置获取连接等待超时的时间 -->
< property name = "maxWait" value = "${maxWait}" />
<!-- 最小空闲连接数 -->
< property name = "minIdle" value = "${minIdle}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
< property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
< property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />
< property name = "validationQuery" value = "${validationQuery}" />
< property name = "testWhileIdle" value = "${testWhileIdle}" />
< property name = "testOnBorrow" value = "${testOnBorrow}" />
< property name = "testOnReturn" value = "${testOnReturn}" />
< property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />
<!-- 打开 removeAbandoned 功能 -->
< property name = "removeAbandoned" value = "${removeAbandoned}" />
<!-- 1800 秒,也就是 30 分钟 -->
< property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />
<!-- 关闭 abanded 连接时输出错误日志 -->
< property name = "logAbandoned" value = "${logAbandoned}" />
</ bean >
dbconfig.properties中的配置(根据自己的情况进行配置): url: jdbc=mysql://localhost:3306/** driverClassName=com.mysql.jdbc.Driver username= root password= root filters=stat maxActive= 20 initialSize= 1 maxWait= 60000 minIdle=10 maxIdle=15 timeBetweenEvictionRunsMillis= 60000 minEvictableIdleTimeMillis: 300000 validationQuery= SELECT 'x' testWhileIdle= true testOnBorrow=false testOnReturn= false maxOpenPreparedStatements= 20 removeAbandoned= true removeAbandonedTimeout= 1800 logAbandoned= true
3、C3P0、DBCP、druid配置区别
DBCP
| c3p0
| Druid
| |
用户名
| username
| user
| username
|
密码
| password
| password
| password
|
URL
| url
| jdbcUrl
| jdbcUrl
|
驱动类名
| driverClassName
| driverClass
| driverClassName
|
最小连接数
| minIdle(0)
| minPoolSize(3)
| minIdle(0)
|
初始化连接数
| initialSize(0)
| initialPoolSize(3)
| initialSize(0)
|
最大连接数
| maxTotal(8)
| maxPoolSize(15)
| maxActive(8)
|
最大等待时间
| maxWaitMillis(毫秒)
| maxIdleTime(0秒)
| maxWait(毫秒)
|
开启缓存功能
| poolPreparedStatements
| maxStatements
| poolPreparedStatements
|
单个连接拥有的最大缓存数
| maxOpenPrepared-Statements
| maxStatementsPer-Connection
| maxOpenPrepared-Statements
|
申请连接检测
| testOnBorrow
| testConnectionOnCheckin
| testOnBorrow
|
是否超时检测
| testWhileIdle
| testWhileIdle
| |
空闲时间
| timeBetweenEvictionRunsMillis
| idleConnectionTestPeriod
| timeBetweenEvictionRunsMillis
|
校验用sql语句
| validationQuery
| preferredTestQuery
| validationQuery
|
归还连接检测
| testOnReturn
| testConnectionOnCheckout
| testOnReturn
|
是否超时关闭连接
| removeAbandoned
| breakAfterAcquireFailure
| removeAbandoned
|
超时时间
| removeAbandonedTimeout
| checkoutTimeout
| removeAbandonedTimeout
|
是否记录日志
| logAbandoned
| logAbandoned
| |
间隔时间
| acquireRetryDelay
| ||
重连次数 | acquireRetryAttempts
|
4、druid配置SQL监控
Druid的监控统计功能是通过 filter-chain 扩展实现,如果你要打开监控统计功能,配置 StatFilter ,StatFilter 的别名是 stat,这个别名映射配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties。 在spring 中使用别名配置方式如下:
<bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close">
... ... <propertyname="filters" value="stat" />
</bean>
StatFilter 可以和其他的 Filter 配置使用,比如:
<beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close">
... ... <propertyname="filters" value="stat,log4j" />
</bean>
其他详情可以参考:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
1、使用 Druid 的内置监控页面
Druid 内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息。 这个 StatViewServlet 的用途包括:
提供监控信息展示的 html 页面 提供监控信息的 JSON API
注意:使用 StatViewServlet ,建议使用 druid 0.2.6 以上版本。
1) 配置web.xml
StatViewServlet 是一个标准的javax.servlet.http.HttpServlet ,需要配置在你 web 应用中的 WEB-INF/web.xml 中。
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet><servlet-mapping>
<servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern>
</servlet-mapping>
根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html 例如:http://110.76.43.235:9000/druid/index.html,http://110.76.43.235:8080/mini-web/druid/index.html
2) 配置allow 和 deny
StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置 allow 和 deny 这两个参数。比如:
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>allow</param-name><param-value>128.242.127.1/24,128.242.128.1</param-value></init-param> <init-param>
<param-name>deny</param-name><param-value>128.242.127.4</param-value>
</init-param>
</servlet>
判断规则:deny 优先于 allow,如果在 deny 列表中,就算在 allow 列表中,也会被拒绝。如果 allow 没有配置或者
为空,则允许所有访问 其他详情参考:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
2、内置监控中的 Web 和 Spring 关联监控配置
WebStatFilter 用于采集 web-jdbc 关联监控的数据。
1)web.xml 配置 <filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter><filter-mapping>
<filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern>
</filter-mapping> 2)exlusions 配置
经常需要排除一些不必要的 url,比如.js,/jslib/等等。配置在 init-param 中。比如: <init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
3)sessionStatMaxCount配置
缺省 sessionStatMaxCount 是 1000 个。你可以按需要进行配置,比如: <init-param>
<param-name>sessionStatMaxCount</param-name><param-value>1000</param-value>
</init-param>
4)sessionStatEnable配置
你可以关闭 session 统计功能,比如:
<init-param>
<param-name>sessionStatEnable</param-name><param-value>false</param-value>
</init-param>
5)principalSessionName配置
你可以配置 principalSessionName,使得 druid 能够知道当前的 session 的用户是谁。比如:
<init-param>
<param-name>principalSessionName</param-name><param-value>xxx.user</param-value> </init-param> 根据需要,把其中的 xxx.user 修改为你 user 信息保存在 session 中的 sessionName。
注意:如果你 session 中保存的是非 string 类型的对象,需要重载 toString 方法。
6)principalCookieName
如果你的 user 信息保存在 cookie 中,你可以配置 principalCookieName,使得 druid 知道当前的 user 是谁
<init-param>
<param-name>principalCookieName</param-name><param-value>xxx.user</param-value>
</init-param> 根据需要,把其中的 xxx.user 修改为你 user 信息保存在 cookie 中的 cookieName
7)profileEnable
druid 0.2.7 版本开始支持 profile,配置 profileEnable 能够监控单个 url 调用的 sql 列表。
<init-param>
<param-name>profileEnable</param-name><param-value>true</param-value> </init-param>