文档章节

Druid连接池四(学习笔记)

是夜色太荒芜
 是夜色太荒芜
发布于 2017/05/20 22:08
字数 2546
阅读 239
收藏 1
点赞 0
评论 0

11. Druid加密

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

ConfigFilter的作用包括:

从配置文件中读取配置

从远程http文件中读取配置

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

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 ....

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>

2.3.配置参数,让ConfigFilter解密密码

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

12. 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

 

13. 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>

14. Druid设计

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

概念

概念

说明

domain

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

app

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

cluster

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

instance

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

15. 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,是组合关系,并非替换关系

 

16. 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)

17. Druid访问

    EvalVisitor是Druid SQL Parser中用于对SQL表达式求值的Visitor。某些场景需要对sql中的部分表达式进行求值然后做特别处理,比如说分库分表时,需要根据其中一个表达式进行求值,以判断其对应的分库分表的规则。

主要接口参数定义如下:

  public interface SQLEvalVisitor extends SQLASTVisitor {        // 设置求值的参数        void setParameters(List<Object> parameters);  }

SQLEvalVisitorUtils

    不同的方言的SQLEvalVisitor的实现类是不同的,所以Druid提供了一个易于使用的工具类SQLEvalVisitorUtils。

  public class SQLEvalVisitorUtils {        public static Object evalExpr(String dbType, String expr, Object... parameters)  }

 第一个参数dbType是数据库的类型,具体的常量值在com.alibaba.druid.util.JdbcConstants中定义。

  public interface JdbcConstants {        public static final String HSQL              = "hsql";        public static final String DB2               = "db2";        public static final String DERBY             = "derby";        public static final String H2                = "h2"        public static final String ORACLE            = "oracle";        public static final String SQL_SERVER        = "sqlserver";        public static final String SYBASE            = "sybase";        public static final String POSTGRESQL        = "postgresql";        public static final String DERBY             = "derby";  }

    第二个参数是需要求值的SQL表达式,比如

3+4? > 3

    第三个参数是需要传入的参数数值,这是一个变长参数,如果第二个参数SQL表达式没有变量,第三个参数是不需要传的。

例子

  // between   Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? between 1 and 3", 0));  Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? between 1 and 3", 2));   // not between  Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? not between 1 and 3", 0));  // case when  Assert.assertEquals(111, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "case ? when 0 then 111 else 222 end", 0));   // in   Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? NOT IN (1, 2, 3)", 0));  Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? IN (1, 2, 3)", 0));   // is null  Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? is null", 0));  Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? is null", (Object) null));   // right function  Assert.assertEquals("rbar", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "right('foobarbar', 4)"));   // instr function  Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "instr('foobarbar', 'bar')"));

 

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

共有 人打赏支持
是夜色太荒芜
粉丝 3
博文 1
码字总数 0
作品 0
济南
程序员
Druid连接池简单入门配置

偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的。 Druid集连接池,监控于一体整好复合当前项目的需要,项目是ssh结构,之前是用C3p0的,现...

凯文加内特
2016/03/05
81
0
spring boot 1.5.4 整合 druid(十三)

上一篇:spring boot 1.5.4 整合 mybatis(十二) 1 集成druid连接池 spring boot集成druid项目mybatis-spring-boot源码: spring-boot相关项目源码, 码云地址:https://git.oschina.net/w...

wyait
2017/09/29
0
0
【开源访谈】Druid 作者温绍锦访谈实录

关于开源访谈 开源访谈是开源中国推出的一系列针对国内优秀开源软件作者的访谈,以文字的方式记录并传播。我们希望开源访谈能全面的展现国内开源软件、开源软件作者的现状,着实推动国内开源...

虫虫
2012/08/22
14.5K
29
druid使用起步--在javaSE中使用druid

以mysql为例,首先在大家学习的教材中,我们通过这样的方式获取到java的数据库连接 /** 数据库驱动名称 / private static final String DB_DRIVER="com.mysql.jdbc.Driver";/** 数据库地址 ...

明月照大江
2013/08/09
0
0
阿里Druid数据连接池在SSM框架中的配置使用

Druid数据连接池简介 首先可以参考阿里在GitHub给出的一些说明: Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 性能好,同时自带监控页面,可以实时监控应用的...

似水的流年
2017/12/31
0
0
提取 Druid 的 SQL 解析器

认识 Druid Druid 是阿里巴巴公司开源的一个数据库连接池,它的口号是:为监控而生的数据库连接池 根据官方 wiki的介绍 Druid 是一个 JDBC 组件库,包括数据库连接池、SQL Parser 等组件,D...

beanlam
2017/01/14
0
0
Druid 0.2.16 发布,阿里巴巴开源数据库连接池

下载地址: http://code.alibabatech.com/mvn/releases/com/alibaba/druid/0.2.16/ Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据...

Google
2013/04/25
3.3K
15
阿里巴巴开源项目 Druid 负责人温少访谈

Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、...

donkeyMeng
2016/12/17
246
0
阿里巴巴开源项目 Druid 负责人温少访谈

挡住去路的,往往不是大树,而是小藤! 阿里巴巴开源项目 Druid 负责人温少访谈 本文是由转载而来. Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL解析 器组...

李永china
2016/08/08
65
0
数据库连性池性能测试(hikariCP,druid,tomcat-jdbc,dbcp,c3p0)

本文主要是对这hikariCP,druid,tomcat-jdbc,dbcp,c3p0几种连接池的详细的功能和性能测试对比,通过这次测试对目前主流的一些连接池做一个全面的对比,从而给业务系统一个最佳的推荐。 测试结论...

asdf08442a
01/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的AsyncLoadBalancerAutoConfiguration

序 本文主要研究一下AsyncLoadBalancerAutoConfiguration AsyncLoadBalancerAutoConfiguration spring-cloud-commons-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/client/loadba......

go4it
12分钟前
0
0
10.19 iptables规则备份和恢复 ,firewalld的9个zone,service的操作

保存和备份iptables规则 内容: 保存iptables规则 service iptables save 把iptables规则备份到my.ipt文件中: iptables-save > my.ipt 恢复刚才备份的规则: iptables-restore < my.ipt 1.......

Linux_老吴
15分钟前
0
0
Vue 自动化表单相关资料

1.使用vue自动化表单 2.Vue可视化,Vue代码生成,Vue动态表单 3.前端表单进阶之路:通过 Vue.js 实现表单可配置化 4.使用Vue动态生成form表单

IT追寻者
16分钟前
0
0
动态SQL

一、动态SQL 1、if <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title l......

一个yuanbeth
18分钟前
0
0
使用ExternalDNS自动化DNS配置

Kubernetes社区的生态繁荣和该领域技术的快速茁壮发展,已经是众所周知。Kubernetes领域有太多强大的、创新的技术产品,而最近引起我注意的项目是ExternalDNS。这是在近期的POC期间客户主动咨...

RancherLabs
23分钟前
0
0
多线程-Lock

今天写了一段测试Lock的代码,如下: namespace TLock{ class Program { static void Main(string[] args) { TMyThread myThread = new TMyThre......

kaixinguo314
33分钟前
0
0
如何清洁你脏兮兮的笔记本电脑?

简评:我还以为清理笔记本就是吹灰。 本文转自纽约时报(中文版),原文见文末。 你知道你的笔记本电脑很脏。你可以看到键盘上的灰尘和污垢,以及触控板中间的皮肤油印。那你上次清洁它是什么...

极光推送
38分钟前
0
0
中国经济模式转型的挑战

  中国经济模式转型的挑战   陈志武(耶鲁大学金融经济学教授)   今天我讲的题目是当前大家关心的,特别是这次金融危机之后,中国学界、决策层还有民间,都很关注中国以后的走向,社会...

吕伯文
43分钟前
2
0
win10玩docker无法Share Drivers的坑

Win10下使用Docker的开启Shared Drivers的时候,一直卡在:Sharing Drivers。 原因如下: 1.检查操作性系统的net share功能开启了没有 cmd-->services.msc 查看Server和Workstation两个S...

傲娇字符
44分钟前
0
0
Intellij Idea快捷键的使用

Ctrl +H 全文搜索 快捷键模式Eclipse Alt +左箭头 上一个方法 Alt + 右箭头 下一个方法 Ctrl + 左键点击文件title 提示文件路径 参考资料 http://wiki.jikexueyuan.com/project/intellij-ide...

轩辕剑
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部