Druid官⽅提供数据密码加密和DruidDataSource源码解读
⼀、Druid官⽅提供数据密码加密
1、执⾏命令加密数据库密码,在【druid-1.0.16.jar】下,打开cmd可以直接执⾏。(com.alibaba.fig.ConfigFilter类中有说明参数配置意义)
java -cp druid-1.0.16.jar com.alibaba.fig.ConfigTools 数据库密码
⽣成结果:公私钥和密码密⽂
privateKey:********************************
publicKey: ********************************
password: ********************************
2、jdbc配置
① 增加参数:
druid.publickey =公钥字符串
② 更改参数
druid.password=明⽂ 变更成 druid.password=密⽂
druid.filters=stat 变更成 druid.filters=stat,config
3、l配置
① 增加name = connectionProperties的配置
<property name ="connectionProperties" value="config.decrypt=true;config.decrypt.key=${druid.publickey}" />
注:config.decrypt=true表⽰启动加密;config.decrypt.key表⽰公钥信息
**
⼆、⾃定义数据库密码加密⽅法及配置
**
1、程序代码DBPasswordCallback类
@Override
public void setProperties(Properties properties) {
log.debug("数据源的连接池加载中...,加载次数:第{}次;共耗时:{} 秒", i++, (System.currentTimeMillis() - now) / 1000 );
// 1. 判断数据库密码是否已被加载
if (getPassword() != null) {
return;
}
// 2. 获取配置的参数值
String pwd = Property("password");
if (StringUtil.isBlank(pwd)) {
return;
}
String pubpath = Property("pubpath");
if (StringUtil.isBlank(pubpath)) {
pubpath = "路径(⾃定义),如:D:/druid/";
}
try {
// 3. 根据路径获取公钥信息
InputStream is = new FileInputStream(pubpath);
int iAvail = is.available();
byte[] bytes = new byte[iAvail];
String pubkey = new String(bytes).trim();
is.close();
// 4. 解密
String password = decrypt(pwd, pubkey);
CharArray());
} catch (Exception e) {
CharArray());
<("类DBPasswordCallback---->密码解密失败", e);
}
}
/**
* 解密
* @param pwd
* @param pubkey
* @return
* @throws Exception
*/
private String decrypt(String pwd, String pubkey) throws Exception {
PublicKey publicKey = PublicKey(pubkey);
String password = ConfigTools.decrypt(publicKey, pwd);
return password;
}
2、jdbc配置
① 增加参数:
druid.publickey =公钥字符串
② 更改参数
druid.password=明⽂ 变更成 druid.password=密⽂
druid.filters=stat 变更成 druid.filters= stat,config
3、l配置
① 对使⽤解密的类注⼊
<bean id="dbPasswordCallback"
class="com.lyb.baseUtil.datasource.DBPasswordCallback" lazy-init="true"/>
② 增加对passwordCallback 的引⽤和name= connectionProperties的配置
<property name="passwordCallback" ref="dbPasswordCallback"/>
<!-- 加密后的密码 -->
<property name="connectionProperties"
value="password=${druid.password};pubkey=${druid.publickey}" />
三、公私钥和密码密⽂⽣成⼯具
1、内部执⾏代码和jar包:
java -cp druid-1.0.16.jar com.alibaba.fig.ConfigTools 数据库密码
2、⼯具双击就会⽣成
四、DruidDataSource源码解读
1、解读来源:因为密码加密缘故,如果没有配置解密⽂件,就会造成连接池不断的重连,造成数据库⽤户被锁住(数据库配置了超过密码输⼊错误次数,就会锁定;严重会影响交易)。
2、初步配置⽅式:
① 重连次数:5 (本⾝次数1次 + 重连次数 + 1) < 触发⽤户被锁次数;breakAfterAcquireFailure配置true。
注:如果执⾏了break,项⽬需要重新启动(不然线程池连接不会重新连接)。【+1是因为errorCount >
connectionErrorRetryAttempts;如果配置次数是5必须6次重试错误,才会触发断开】。
② 重连次数:3 (本⾝次数1次 + 重连次数 + 1) < 触发⽤户被锁次数;timeBetweenConnectErrorMillis时间配置⼤些5~10分钟,可以检查出程序是否有问题。
注:不会执⾏break,只要连接正常了,线程池连接会重新连接
3、xml数据源配置
<!-- 线程池重连次数:默认30次 -->
<property name="connectionErrorRetryAttempts" value="30" />
<!-- 数据库服务宕机⾃动重连机制:false表⽰不重连,true表⽰重连(默认false) -->
<property name="breakAfterAcquireFailure" value="false" />
<!-- 连接出错后重试时间间隔(默认30秒) -->
<property name="timeBetweenConnectErrorMillis" value="30000" />
<!-- 源码判断是否重连:errorCount连接失败次数,breakAfterAcquireFailure判断是否跳出-->
for (;;) {
.... 省略代码(正常情况不会退出for循环,线程抛出中断异常Interrupted时,会退出)
if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) {
if (breakAfterAcquireFailure) {
break;
}
try {
Thread.sleep(timeBetweenConnectErrorMillis);
} catch (InterruptedException interruptEx) {
break;
}
druid连接池配置详解}
.... 省略代码(正常情况不会退出for循环,线程抛出中断异常Interrupted时,会退出)
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论