Druid连接池(四)
十七、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 |
配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 |
|
|
url |
连接数据库的url,不同数据库不一样。例如: |
|
|
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) |
有两个含义: |
|
numTestsPerEvictionRun |
不再使用,一个DruidDataSource只支持一个EvictionRun |
|
|
minEvictableIdleTimeMillis |
30分钟(1.0.14) |
连接保持空闲而不被驱逐的最长时间 |
|
connectionInitSqls |
物理连接初始化的时候执行的sql |
|
|
exceptionSorter |
根据dbType自动识别 |
当数据库抛出一些不可恢复的异常时,抛弃连接 |
|
filters |
属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: |
|
|
proxyFilters |
类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系 |
二十二、Druid锁
锁的公平和效率是一个需要平衡的问题。
如果配置了maxWait,在连接不够用争用时,unfair模式的ReentrantLock.tryLock方法存在严重不公的现象,个别线程会等到超时了还获取不到连接。
|
版本 |
处理方式 |
效果 |
|
0.2.3之前 |
unfair |
并发性能很好。 |
|
0.2.3 ~ 0.2.6 |
fair |
公平,但是并发性能很差 |
|
0.2.7 |
通过构造函数传入参数指定fair或者unfair,缺省fair |
按需要配置,但是比较麻烦 |
|
0.2.8 |
缺省unfair,通过构造函数传入参数指定fair或者unfair; |
智能配置,能够兼顾性能和公平性 |
可以手工配置
dataSouce.setUseUnfairLock(true)
文章转自:http://blog.csdn.net/yinxiangbing/article/details/47905465
Druid连接池(四)的更多相关文章
- Spring Boot (四): Druid 连接池密码加密与监控
在上一篇文章<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari> 我们介绍了 JPA 与连接池 Hikari 的整合使用,在国内使用比较多的连接池还有一个是阿 ...
- Druid连接池
Druid 连接池简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.J ...
- SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...
- Druid连接池使用
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11280540.html 一:DRUID连接池简介 阿里出品的“为监控而生”的数据库连接池,在功能.性能.扩展 ...
- Spring整合JDBC和Druid连接池
我的博客名为黑客之谜,喜欢我的,或者喜欢未来的大神,点一波关注吧!顺便说一下,双十二快到了,祝大家双十二快乐,尽情的买买买~ 如果转载我的文章请标明出处和著名,谢谢配合. 我的博客地址为: https ...
- JDBC 连接DRUID 连接池!
一.1.创建一个floder目录,[名称lib] 2. 导入mysql.jar包和 druid.jar 包.---------->bulid path 二.创建 sourcefolder 目录 ...
- druid连接池获取不到连接的一种情况
数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...
- 使用druid连接池的超时回收机制排查连接泄露问题
在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: ...
- Java自己动手写连接池四
Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...
- 使用MyBatis集成阿里巴巴druid连接池(不使用spring)
在工作中发现mybatis默认的连接池POOLED,运行时间长了会报莫名其妙的连接失败错误.因此采用阿里巴巴的Druid数据源(码云链接 ,中文文档链接). mybatis更多数据源参考博客链接 . ...
随机推荐
- Android-Android7.0-java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
某个AndroidProject项目在Android5.0系统运行是OK的,在Android7.0以上版本运行,报以下错误❌ 2019-01-02 15:33:39.996 17067-17067/? ...
- Spring Boot 应用系列 4 -- Spring Boot 2 整合log4j2
一.背景 1. log4j2传承于log4j和logback,它是目前性能最好的日志处理工具,有关它们的性能对比请看: 2. 除了性能好之外,log4j2有这么几个重要的新features: (1) ...
- 接口interface和抽象类型abstract
一.接口 接口不能被实例化 接口只能包含方法声明 接口的成员包括方法.属性.索引器.事件 接口中不能包含常量.字段(域).构造函数.析构函数.静态成员 接口中的所有成员默认为public,因此接口中不 ...
- Linked List-237. Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- 2018 Multi-University Training Contest 4
累惹. B. Harvest of Apples 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意:求∑(i=0,m) C(n,m). 分 ...
- [JavaScript] 时间戳格式化为yyyy-MM-dd日期
function formateDate(timestamp){ var date = new Date(timestamp); var y = 1900+date.getYear(); var m ...
- java的几种定时任务
本篇博文主要是讲述2.x 版本的quartz下的实现方案,1.x 版本的实现方式大致原理一致,但是具体的实现方式有些不一致,具体体现在获取 scheduler 这个类的方式上有些不同,这里不作过多的 ...
- 【wireshark】Wireshark原理分析与二次开发系列
1.版权声明 本系列文章是本人花了很多心血写成,wireshark本是开源软件,本人也乐于技术知识和经验的分享,更是欣赏和推崇开源精神,因此任何看到本文的人都可以随意转载,但只有一个要求: 在大段甚至 ...
- Archlinux Setup AUR
方案一 pacman -Sy yaourt yaourt -Sy pacaur pacaur -Sa xxx 方案二 git clone git clone https://aur.archlinux ...
- Jmeter之Bean shell使用
转载地址:http://www.cnblogs.com/puresoul/p/4915350.html 一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且 ...