执行了错误的sql。
问题就出在druid连接池上,连接池在执行完了某一条错误的sql以后,报错信息会被保存在执行sql的线程中,当下一条拿到这个线程的sql执行时,就直接报错,而不会去执行sql。
最终的解决方法就是解决那条问题线程,肯定是哪里出错才会保留报错信息,或者升级druid的版本。
本文的demo示例均来源于官网。
Druid的查询是使用Rest风格的>
画外音:目前Druid在开源中国举办的2019年度最受欢迎中国开源软件中排名第7名,支持Druid的朋友可以去投票哇。 2019年度最受欢迎中国开源软件
maxWait :从连接池中获取连接的最大等待时间,单位ms,默认-1,即会一直等待下去
笔者在使用Druid时都会设置这个参数,这样如果是获取连接超时,更容易从日志中获取调用失败的原因。
如果超时,Druid会抛出以下异常
在DruidDataSource中的getConnectionInternal方法使用到了maxWait
maxWait默认是不超时,即如果连接池没有空闲连接,则会一直等待下去,但是一般的接口都是有超时时间的,如果接口超时,不方便定位出来是获取不到连接导致的,最好设置maxWait,并且小于接口的超时时间。
@wenshao 你好,想跟你请教个问题:我实现一个DruidPasswordCallback子类,并配置到dataSource的property中:
1
2
3
<property name="passwordCallback" >
<bean class="utilsDBPasswordCallback" />
</property>
DBPasswordCallback类实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DBPasswordCallback extends DruidPasswordCallback {
/
serialVersionUID
/
private static final long serialVersionUID = 1L;
@Override
public void setProperties(Properties properties)
{
supersetProperties(properties);
String pwd = propertiesgetProperty("password");
if (!StringUtilisTrimEmpty(pwd)) {
try {
setPassword(EncryptUtildecrypt2AES(pwd)toCharArray());
} catch (Exception e) {
setPassword(pwdtoCharArray());
}
}
}
}
可是无法解密。 调试时发现properties是空的({}),取不到jdbc配置的原始密码,所以后面的 *** 作也就没有意义了。 大家知道正确的做法吗?
Druid版本102
单车架构师
发帖于 2年前
3回/634阅
标签: Druid
举报
| 分享到
0收藏(1)
按票数排序 显示最新答案 共有3个答案 (最后回答: 2年前 )
0
单车架构师2年前
有人知道吗?
评论(0)| 引用此答案| 举报 (2014-02-22 12:57)
0
兮风古道2年前
可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}
}
}
评论(0)| 引用此答案| 举报 (2014-02-22 13:37)
0
单车架构师2年前
引用来自“兮风古道”的答案
可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}
}
}
Java单体项目里,我们一般是只需配置一个数据库,这时代码里的dao层都是只对一个数据库 *** 作;但有时候我们的数据可能在2个或者3个数据库,这时就需要配置更多数据源,进行数据库直连 *** 作,下面以MySQL的两个库为例(Oracle也就换个驱动类与连接串)。
(本文阅读大概花费两分钟)
技术条件:
springboot 253 (即springframework 539)
MySQL 57
mybatis-plus 350
dynamic-datasource 350
druid 129
idea开发工具、maven 339
1、导入相关依赖
2、建立两个数据库mydb(表 user)、db2(表t_class),并分别建一张表
3、编写applicationyaml配置文件
4、编写po类、dao层、一个接口测试类
其中,在dao的类加上对应的数据源标识符,使用此注解combaomidoudynamicdatasourceannotationDS
5、启动项目,查看结果
至此,多数据源环境集成成功;当然这里只使用了查询功能,对应事务相关的下一回合文章再做讨论啥。
spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。
而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
comalibabadruidpoolDruidDataSourceFactory实现了javaxnamingspiObjectFactory,可以作为JNDI数据源来配置。
一、下载Druid的jar包
下载地址:>
以上就是关于在使用druid数据库连接池执行后为啥会出现出现无效的源发行版14全部的内容,包括:在使用druid数据库连接池执行后为啥会出现出现无效的源发行版14、Druid查询语法、Druid配置参数详解-maxWait等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)