spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。
而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
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;
}
可以扩展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;
}
}
}
执行了错误的sql。
问题就出在druid连接池上,连接池在执行完了某一条错误的sql以后,报错信息会被保存在执行sql的线程中,当下一条拿到这个线程的sql执行时,就直接报错,而不会去执行sql。
最终的解决方法就是解决那条问题线程,肯定是哪里出错才会保留报错信息,或者升级druid的版本。
如果连接数大于最大数目,后面的连线会失败,无法连接。
不管何种数据库,一般都有定义最大连接数,否则若不限制连接数,会使数据库处理不过来而崩溃。
设置连接数的好处,就是保证已连接用户的正常使用。
当连接数大于最大数目时,后面的连接会无法连接,但已连接上的用户使用不受影响。
只有之前的用户断开连接,后面的用户才可以连接上。相当于在总数不变的情况下,最多只能保持收支平衡,不可以收大于支。
一种是在代码中写死通过NEW *** 作符创建DataSSource,然后set一些连接属性,这里不在累述;另外一种是基于SPRING的配置方法,然后让SPRING的Context自动加载配置!
使用完后必须conclose()掉,
使用连接池的话,执行conclose并不会关闭与数据库的TCP连接,而是将连接还回到池中去,如果不close掉的话,这个连接将会一直被占用,直接连接池中的连接耗尽为止。
以上就是关于springboot 中druid怎么连接多个数据库全部的内容,包括:springboot 中druid怎么连接多个数据库、Druid源码分析(四) 从连接池获取数据库链接getConnectionDirect()、Druid连接池自定义数据库密码加解密怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)