Druid配置详解,新手必须读

什么是Druid

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
Druid也是配置最简单使用最方便的一种连接池。
Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以

Druid配置过程

  • 加入maven依赖
	<dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>最新版本version>
   dependency>
  • 参数说明

配置

缺省值

说明

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,也就是PSCachePSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

maxOpenPreparedStatements

-1

要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在OraclePSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

validationQuery

 

用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuerynulltestOnBorrowtestOnReturntestWhileIdle都不会其作用。

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,如果同时配置了filtersproxyFilters,是组合关系,并非替换关系

 

  • spring-db.xml配置文件
    
    <bean name="pooledDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        
        <property name="url" value="jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&useSSL=false&characterEncoding=utf8" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="username" value="账号" />
        <property name="password" value="密码" />
        
        <property name="initialSize" value="0" />
        
        <property name="maxActive" value="1500" />
        
        <property name="minIdle" value="0" />
        
        <property name="maxWait" value="60000" />

        
         
            

        
        <property name="validationQuery" value="${validationQuery}" />
        
        <property name="testWhileIdle" value="true" />
        
        <property name="testOnBorrow" value="false" />
        
        <property name="testOnReturn" value="false" />

        
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        
        <property name="minEvictableIdleTimeMillis" value="25200000" />

        
        <property name="removeAbandoned" value="true" />
        
        <property name="removeAbandonedTimeout" value="1800" />
        
        <property name="logAbandoned" value="true" />
        
        <property name="filters" value="start" />
    bean>
  • web.xml

    <filter>
        <filter-name>druidWebStatFilterfilter-name>
        <filter-class>com.alibaba.druid.support.http.WebStatFilterfilter-class>
        <init-param>
            <param-name>exclusionsparam-name>
            <param-value>/assets/*,*.css,*.js,*.gif,*.jpg,*.png,*.ico,*.eot,*.svg,*.ttf,*.woff,*.jsp,*.tpl,/druid/*param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>druidWebStatFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <servlet>
        <servlet-name>DruidStatViewservlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServletservlet-class>
        <init-param>
            
            <param-name>resetEnableparam-name>
            <param-value>trueparam-value>
        init-param>
        <init-param>
            
            <param-name>loginUsernameparam-name>
            <param-value>adminparam-value>
        init-param>
        <init-param>
            
            <param-name>loginPasswordparam-name>
            <param-value>adminparam-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>DruidStatViewservlet-name>
        <url-pattern>/druid/*url-pattern>
    servlet-mapping>

只需要在启动spring窗口时候把加载数据操作换成加载spring-db.xml配置文件内容即可。
启动后在页面输入localhost:8080/druid
druid监控页面


SpringBoot

  • 加入maven依赖
		<dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>最新版本version>
        dependency>
  • yum文件配置
spring:
  datasource:
#   数据源基本配置
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud
    type: com.alibaba.druid.pool.DruidDataSource
#   数据源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙  
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true  
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    
  • 添加配置类
@Configuration
public class DruidConfig{

	@ConfigurationProperties(prefix='spring.datasource')
    @Bean
    public DateSource druid(){        
        return new DruidDataSource();
    }

	//配置Druid监控
	public ServletRegistrationBean statViewServlet(){
		ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
		
		Map<String,String> initParams=new HashMap<>();
		initParams.put("loginUsername","admin");
		initParams.put("loginPassword","admin");
		initParams.put("allow","");//默认允许所有访问
		
		bean.setInitParameters(initParams);
		return bean;
	}

	//配置一个web监控的filter
	public FilterRegistrationBean webStatFilter(){
		FilterRegistrationBean bean=new FilterRegistrationBean();
		bean.setFilter(new WebStatFilter());
	
		Map<String,String> initParams=new HashMap<>();
		initParams.put("exclusions","*.js,*.css,/druid/*");

		bean.setInitParameters(initParams);
		bean.setUrlPatterns(Arrays.asList("/*"));
		return bean;
	}
}

扩展配置

  • spring监控
    经过上述配置可以对sql进行监控,如果需要对spring容器进行监控需要改一下spring-db.xml配置文件(小编没有配置spring监控,发现可以对spring进行监控,有兴趣的小伙伴可以试一下)
    上述完成后在spring-db.xml配置文件末添加
     
    <bean id="druid-stat-interceptor"
          class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />

    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
          scope="prototype">
        <property name="patterns">
            <list>
                
                <value>com.springmvc.contorller.*value>
                <value>com.springmvc.service.*value>
            list>
        property>
    bean>
    <aop:config proxy-target-class="true">
        <aop:advisor advice-ref="druid-stat-interceptor"
                     pointcut-ref="druid-stat-pointcut" />
    aop:config>
  • druid密码加密
    durid还有一个功能是密码加密。普通连接池是需要把密码以明文方式写入配置文件中,别人可以直接获得数据账号和密码等重要信息,通过druid加密后就可以避免这个问题。
    可以参考表格password加密提示进行操作。
    引入druid依赖程序会下载druid的Jar包,我们需要找到maven仓库中Jar包下载位置,在空白处按shift并右击选择用命令窗口打开
    Druid配置详解,新手必须读_第1张图片
    执行
java -cp druid-1.1.13.jar com.alibaba.druid.filter.config.ConfigTools 数据库密码

Druid配置详解,新手必须读_第2张图片
会生成公钥、私钥和密码,我们需要公钥和密码进行配置
修改spring-db.xml配置文件

		
		<property name="filters" value="start,config" />
		
        <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${jdbc.publicKey}"/>

你可能感兴趣的:(架构)