十七、Druid加密

  运维和DBA都不希望把密码明文直接写在配置文件中,Druid提供了数据库密码加密的功能。

  ConfigFilter的作用包括:

  从配置文件中读取配置

  从远程http文件中读取配置

  为数据库密码提供加密功能

  17.1、配置ConfigFilter

  1.1.配置文件从本地文件系统中读取

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"      init-method="init" destroy-method="close">      
  <property name="filters" value="config" />
  <property name="connectionProperties" value="config.file=file:///home/admin/druid-pool.properties" />
</bean>

  1.2.配置文件从远程http服务器中读取

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"      init-method="init" destroy-method="close">      
  <property name="filters" value="config" />
  <property name="connectionProperties" value="config.file=http://127.0.0.1/druid-pool.properties" />
</bean>

  这种配置方式,使得一个应用集群中,多个实例可以从同一个地方读取配置,集中配置,集中修改,部署更简单。

  1.3.通过jvm启动参数来使用ConfigFilter

  DruidDataSource支持jvm启动参数配置filters,所以你可以:
java -Ddruid.filters=config ....

  17.2、数据库密码加密

  数据库密码直接写在配置中,对运维安全来说,是一个很大的挑战。Druid为此提供一种数据库密码加密的手段ConfigFilter。

  2.1.执行命令加密数据库密码

  在命令行中执行如下命令:

java -cp druid-0.2.23.jar com.alibaba.druid.filter.config.ConfigTools you_password

  输出

h9gzp23dkJIZ95Xzj/waxsC2oJ1JoWTh76o4aw7+uGGh63ovAULVOrPewOwHP5i3LCIXqNyvpxJ2nceDFBbzVw==

  输入你的数据库密码,输出的是加密后的结果。

  2.2.配置数据源,提示Druid数据源需要对数据库密码进行解密。

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"      init-method="init" destroy-method="close">      
  <property name="url" value="jdbc:derby:memory:spring-test;create=true" />
  <property name="username" value="sa" />
  <property name="password" value="h9gzp23dkJIZ95Xzj/waxsC2oJ1JoWTh76o4aw7+uGGh63ovAULVOrPewOwHP5i3LCIXqNyvpxJ2nceDFBbzVw==" />
  <property name="filters" value="config" />
  <property name="connectionProperties" value="config.decrypt=true" />
</bean>

  17.3、配置参数,让ConfigFilter解密密码

  有三种方式配置:
      1) 可以在配置文件my.properties中指定config.decrypt=true 
      2) 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true 
      3) 也可以在jvm启动参数中指定-Ddruid.config.decrypt=true

十八、Druid其他

  如果在init的时候失败了,不再使用DruidDataSource,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。

  DruidDataSource支持所有有jdbc驱动的数据:

数据库

支持状态

mysql

支持,大规模使用

oracle

支持,大规模使用

sqlserver

支持

postgres

支持

db2

支持

h2

支持

derby

支持

sqlite

支持

sybase

支持

  使用jdbc的executeBatch 方法,如果数据库为oracle,则无论是否成功更新到数据,返回值都是-2,而不是真正被sql更新到的记录数,这是Oracle JDBC Driver的问题,Druid不作特殊处理。

  Druid是根据url前缀来识别DriverClass的,这样使得配置更方便简洁。

前缀

DriverCLass

描述信息

jdbc:derby

org.apache.derby.jdbc.EmbeddedDriver

jdbc:mysql

com.mysql.jdbc.Driver

jdbc:oracle

oracle.jdbc.driver.OracleDriver

jdbc:microsoft

com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:sybase:Tds

com.sybase.jdbc2.jdbc.SybDriver

jdbc:jtds

net.sourceforge.jtds.jdbc.Driver

jdbc:postgresql

org.postgresql.Driver

jdbc:fake

com.alibaba.druid.mock.MockDriver

jdbc:mock

com.alibaba.druid.mock.MockDriver

jdbc:hsqldb

org.hsqldb.jdbcDriver

jdbc:db2

COM.ibm.db2.jdbc.app.DB2Driver

DB2的JDBC Driver十分混乱,这个匹配不一定对

jdbc:sqlite

org.sqlite.JDBC

jdbc:ingres

com.ingres.jdbc.IngresDriver

jdbc:h2

org.h2.Driver

jdbc:mckoi

com.mckoi.JDBCDriver

jdbc:cloudscape

COM.cloudscape.core.JDBCDriver

jdbc:informix-sqli

com.informix.jdbc.IfxDriver

jdbc:timesten

com.timesten.jdbc.TimesTenDriver

jdbc:as400

com.ibm.as400.access.AS400JDBCDriver

jdbc:sapdb

com.sap.dbtech.jdbc.DriverSapDB

jdbc:JSQLConnect

com.jnetdirect.jsql.JSQLDriver

jdbc:JTurbo

com.newatlanta.jturbo.driver.Driver

jdbc:firebirdsql

org.firebirdsql.jdbc.FBDriver

jdbc:interbase

interbase.interclient.Driver

jdbc:pointbase

com.pointbase.jdbc.jdbcUniversalDriver

jdbc:edbc

ca.edbc.jdbc.EdbcDriver

jdbc:mimer:multi1

com.mimer.jdbc.Driver

十九、Druid保存

  Druid中有DruidDataSource/Spring/Web等监控记录,其中DruidDataSource提供了保存监控记录的API。

  保存DruidDataSource的监控记录

 DruidDataSource有一个属性timeBetweenLogStatsMillis,配置timeBetweenLogStatsMillis>0之后,DruidDataSource会定期把监控数据输出到日志中。

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">    
  ... ...
  <property name="timeBetweenLogStatsMillis" value="300000" />
  ... ...
</bean>

  或者通过jvm启动参数来指定,例如:

 -Ddruid.timeBetweenLogStatsMillis=300000

  定制StatLogger

  DruidDataSource是通过

com.alibaba.druid.pool.DruidDataSourceStatLoggerImpl.DruidDataSourceStatLoggerImpl来实现输入监控数据到日志的,你可以自定义一个StatLogger,例如:

  Java代码

import com.alibaba.druid.pool.DruidDataSourceStatLoggerAdapter;  
import com.alibaba.druid.pool.DruidDataSourceStatLogger ;
public class MyStatLogger extends DruidDataSourceStatLoggerAdapter implements DruidDataSourceStatLogger {
  ... ...
}

  配置

<bean id="myStatLogger" class="com.mycompany.MyStatLogger">    
  ... ...
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  ... ...
  <property name="statLogger" ref="myStatLogger" />
  ... ...
</bean>

二十、Druid设计

   Druid提供了大量监控数据,这些监控数据如果只保存在内存中,重启之后就会丢失。而且无法集中查看多台机器的信息。所以需要提供一个内置的存储实现。

概念

概念

说明

domain

不同的domain数据互相隔离,domain的概念存在,使得druid-monitor能够支持云监控

app

app存在与domain下,每个app可以部署多个集群(cluster)

cluster

cluster是app部署的一套环境,cluster包含多个instance

instance

instance包含的信息有name(可以为空)、host(主机名称)、ip、pid(进程ID)

二十一、Druid属性

  DruidDataSource配置兼容DBCP,但个别配置的语意有所区别。

配置

缺省值

说明

name

配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。
如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 
另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错
详情-点此处。

url

连接数据库的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。在mysql下建议关闭。

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分钟(1.0.14)

有两个含义:
1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

numTestsPerEvictionRun

不再使用,一个DruidDataSource只支持一个EvictionRun

minEvictableIdleTimeMillis

30分钟(1.0.14)

连接保持空闲而不被驱逐的最长时间

connectionInitSqls

物理连接初始化的时候执行的sql

exceptionSorter

根据dbType自动识别

当数据库抛出一些不可恢复的异常时,抛弃连接

filters

属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall

proxyFilters

类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

 二十二、Druid锁

  锁的公平和效率是一个需要平衡的问题。

 如果配置了maxWait,在连接不够用争用时,unfair模式的ReentrantLock.tryLock方法存在严重不公的现象,个别线程会等到超时了还获取不到连接。

版本

处理方式

效果

0.2.3之前

unfair

并发性能很好。
maxWait>0的配置下,出现严重不公平现象

0.2.3 ~ 0.2.6

fair

公平,但是并发性能很差

0.2.7

通过构造函数传入参数指定fair或者unfair,缺省fair

按需要配置,但是比较麻烦

0.2.8

缺省unfair,通过构造函数传入参数指定fair或者unfair;
如果DruidDataSource还没有初始化,修改maxWait大于0,自动转换为fair模式

智能配置,能够兼顾性能和公平性

  可以手工配置

 dataSouce.setUseUnfairLock(true)

文章转自:http://blog.csdn.net/yinxiangbing/article/details/47905465

Druid连接池(四)的更多相关文章

  1. Spring Boot (四): Druid 连接池密码加密与监控

    在上一篇文章<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari> 我们介绍了 JPA 与连接池 Hikari 的整合使用,在国内使用比较多的连接池还有一个是阿 ...

  2. Druid连接池

    Druid 连接池简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.J ...

  3. SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

    一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...

  4. Druid连接池使用

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11280540.html 一:DRUID连接池简介 阿里出品的“为监控而生”的数据库连接池,在功能.性能.扩展 ...

  5. Spring整合JDBC和Druid连接池

    我的博客名为黑客之谜,喜欢我的,或者喜欢未来的大神,点一波关注吧!顺便说一下,双十二快到了,祝大家双十二快乐,尽情的买买买~ 如果转载我的文章请标明出处和著名,谢谢配合. 我的博客地址为: https ...

  6. JDBC 连接DRUID 连接池!

    一.1.创建一个floder目录,[名称lib] 2. 导入mysql.jar包和 druid.jar 包.---------->bulid path 二.创建  sourcefolder 目录 ...

  7. druid连接池获取不到连接的一种情况

    数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...

  8. 使用druid连接池的超时回收机制排查连接泄露问题

    在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: ...

  9. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  10. 使用MyBatis集成阿里巴巴druid连接池(不使用spring)

    在工作中发现mybatis默认的连接池POOLED,运行时间长了会报莫名其妙的连接失败错误.因此采用阿里巴巴的Druid数据源(码云链接 ,中文文档链接). mybatis更多数据源参考博客链接 . ...

随机推荐

  1. 在MS单元测试中引发期望异常

    首先准备一个引发异常的方法. public static void ThrowException() { throw new ArgumentException(); } 然后在单元测试项目中,写下测 ...

  2. 理解go语言 协程之间的通讯

    go已经越来越被重视了,特别适合大型互联网公司基础服务的编写,高效,高并发,可以同时允许多个明星出轨,多个明星结婚 都不在话下,下面介绍下GO协程通讯的过程 直接上代码 package main im ...

  3. 构建NetCore应用框架之实战篇(六):BitAdminCore框架架构小结

    本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.小结 1.前面已经完成框架的第一个功能,本篇做个小结. 2.直接上 ...

  4. RabbitMQ之消息持久化(转)

    原文地址 https://blog.csdn.net/u013256816/article/details/60875666/ 消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证 ...

  5. C++中new申请动态数组

    C++中数组分为静态数组和动态数组,静态数组必须确定数组的大小,不然编译错误:而动态数组大小可以不必固定,用多少申请多少.静态数组类于与我们去餐馆吃饭,餐馆会把菜做好.而动态数组类似于我们自己买菜做饭 ...

  6. VUE 项目刷新路由指向index.html

    背景描述: VUE 项目经过 npm run bulid 生成静态文件上传到服务器后,当我们切换路由并刷新页面,nginx 服务器会报 502 或者 404 错误. 原因分析: 我猜测是因为在 VUE ...

  7. Java之常用类库

    1.Java常用类库(一):http://blog.csdn.net/e6894853/article/details/7925469 1.Java常用类库(二):http://blog.csdn.n ...

  8. 【xsy1147】 异或(xor) 可持久化trie

    我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...

  9. java基本语法二

    1 运算符 1.1 运算符的概念 运算符是一种特殊的符号,用以表示数据的运算.赋值和比较等. 在java语言中,运算符有如下的分类: ①算术运算符. ②赋值运算符. ③比较运算符(关系运算符). ④逻 ...

  10. Monkey捕获Crash原理

    Android的RuntimeInit.commonInit中会设置UncaughtHandler ActivityManagerService(AMS)在执行handleApplicationCra ...