Druid连接池自定义数据库密码加解密怎么实现

Druid连接池自定义数据库密码加解密怎么实现,第1张

可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考

public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{

/

重写父类方法,解密指定属性名对应的属性值

/

@Override

protected String convertProperty(String propertyName,String propertyValue){

if(isEncryptPropertyVal(propertyName)){

return DesUtilsgetDecryptString(propertyValue);//调用解密方法

}else{

return propertyValue;

}

}

/

判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头

@param propertyName

@return

/

private boolean isEncryptPropertyVal(String propertyName){

if(propertyNamestartsWith("encrypt")){

return true;

}else{

return false;

}

}

}

public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {

// 超时重试次数,达到这个值就报错

int notFullTimeoutRetryCnt = 0;

for (; ; ) {

// handle notFullTimeoutRetry

DruidPooledConnection poolableConnection;

try {

// 核心逻辑

poolableConnection = getConnectionInternal(maxWaitMillis);

} catch (GetConnectionTimeoutException ex) {

if (notFullTimeoutRetryCnt <= thisnotFullTimeoutRetryCount && !isFull()) {

notFullTimeoutRetryCnt++;

if (LOGisWarnEnabled()) {

LOGwarn("get connection timeout retry : " + notFullTimeoutRetryCnt);

}

continue;

}

throw ex;

}

mybatis是警察

druid是武器库(有很多q)

jdbc是武器商(他们造q给武器库)

当你需要一次"除暴安良"时,你需要去找警察,警察从武器库拿q干活

以往的开发,是你使用jdbc直接造q,然后自己干活

jdbc整合了:加载数据库驱动,创建连接,写原生语句,执行,关闭这些东西

而mybatis是对jdbc的封装,他允许你通过配置的形式,配置数据库参数,并且允许你通过xml来写动态sql语句<if:test>让你可以把sql变得灵活起来并且还能将你的查询结果直接映射到你想要的实体上面

然后你就去配置你的用户名,密码,连接超时,等等

等你下次使用mybatis时,他后面会根据你的配置,帮你加载数据库驱动,创建连接,写原生语句,执行,关闭

但是mybatis发现,在你每次访问都要重新创建创建连接,写,关很麻烦,所以mybatis说,我可以接受你再配置一个连接池,比如druid

mybatis让你指定连接池是谁,如druid之后将原来自己需要搞的东西都交给druid什么账号了,密码了都给他,让druid帮你创建一批连接,在你需要用的时候,mybatis从druid里面拿一个就行

下面是一次简单的访问流程:

controller->service->dao->mapper

1首先项目启动时druid就已经使用jdbc创建好一堆连接了,留待后用

2当请求到mapper时,mybatis框架创建临时类

3然后将动态sql进行替换重写,变成原始的native sql

4从druid拿到一个连接

5将sql通过连接交给数据库执行

6然后获取执行结果

7mybatis进行将结果进行映射,返回数据

说的有点乱,希望能说清楚吧

执行了错误的sql。

问题就出在druid连接池上,连接池在执行完了某一条错误的sql以后,报错信息会被保存在执行sql的线程中,当下一条拿到这个线程的sql执行时,就直接报错,而不会去执行sql。

最终的解决方法就是解决那条问题线程,肯定是哪里出错才会保留报错信息,或者升级druid的版本。

<obj name="dataSource" type="comalibabadruidpoolDruidDataSource">

<field name="driverClassName"><str>oraclejdbcdriverOracleDriver</str></field>

<field name="url"><str>jdbc:oracle:thin:@127001:1521:tsoc</str></field>

<field name="username"><str>user</str></field>

<field name="password"><str>123456</str></field>

<field name="maxActive"><int>500</int></field>

<field name="minIdle"><int>30</int></field>

<!-- 配置获取连接等待超间 -->

<field name="maxWait"><int>10000</int></field>

<!-- 配置间隔久才进行检测检测需要关闭空闲连接单位毫秒 -->

<field name="timeBetweenEvictionRunsMillis"><int>60000</int></field>

<!-- 配置连接池存间单位毫秒 -->

<field name="minEvictableIdleTimeMillis"><int>300000</int></field>

<field name="testWhileIdle"><bool>true</bool></field>

<field name="testOnBorrow"><bool>false</bool></field>

<field name="testOnReturn"><bool>false</bool></field>

<field name="defaultAutoCommit"><bool>true</bool></field>

<field name="validationQuery"><str>select 1 + 1</str></field>

</obj>

补充:数据库连接并没耗尽使用select from v$session才36使用其测试程序或者客户端工具都连接数据库

转载仅供参考!

以上就是关于Druid连接池自定义数据库密码加解密怎么实现全部的内容,包括:Druid连接池自定义数据库密码加解密怎么实现、Druid源码分析(四) 从连接池获取数据库链接getConnectionDirect()、mybatis+druid+jdbc 原理介绍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10175916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存