druid相关知识

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>
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值