javascript
spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换
每一個請求與其他的用戶是面對不同的數(shù)據(jù)庫,這就需要用到動態(tài)數(shù)據(jù)源切換,來滿足不同數(shù)據(jù)庫、不同數(shù)據(jù)表(不同數(shù)據(jù)源)的靈活調(diào)用。
動態(tài)數(shù)據(jù)源切換
滿足mysql、oracle等主流數(shù)據(jù)庫進(jìn)行動態(tài)數(shù)據(jù)源切換。
使用方法
- 在 WEB-INF 目錄下建立 lib 目錄,并把jar包復(fù)制到 lib 目錄;
- 在maven配置文件,即 pom.xml 中,需要包含以下依賴:
org.aspectj
aspectjweaver
1.8.13
org.springframework
spring-context
5.0.4.RELEASE
org.springframework
spring-web
5.0.4.RELEASE
javax.servlet
servlet-api
2.5
provided
dynamicds
dynamicds
1.0
system
${project.basedir}/src/main/webapp/WEB-INF/lib/dynamicds.jar
注冊項目的數(shù)據(jù)源(這是必須要做的)
繼承DynamicDataSourceRegister類,并完成相關(guān)的方法重寫。
import com.ycj.fastframe.dynamicds.aop.DynamicDataSourceRegister;
import com.ycj.fastframe.dynamicds.entity.DataBaseInfo;
import org.springframework.core.env.Environment;
import java.util.List;
/**
* @author: Frank
* @email 1320259466@qq.com
* @date: 2019/11/17
* @time: 12:57
* @fuction: about the role of class.
*/
public class MyDataSource extends DynamicDataSourceRegister {
@Override
public DataBaseInfo initDefaultDataSource(Environment env) {
// 讀取主數(shù)據(jù)源
DataBaseInfo dataBaseInfo=new DataBaseInfo();
dataBaseInfo.setDriver(env.getProperty("spring.datasource.driver"));
dataBaseInfo.setUrl(env.getProperty("spring.datasource.url"));
dataBaseInfo.setUsername(env.getProperty("spring.datasource.username"));
dataBaseInfo.setPassword(env.getProperty("spring.datasource.password"));
dataBaseInfo.setType("com.alibaba.druid.pool.DruidDataSource");
return dataBaseInfo;
}
@Override
public List initOtherDataSources(Environment env) {
return null;
}
}
設(shè)置數(shù)據(jù)源切換規(guī)則(這個可以四選一實現(xiàn)就行)
架構(gòu)中采用了LRU算法的緩存策略,以適應(yīng)高并發(fā)和高性能需求。這里舉例其中一個實現(xiàn)策略,只需要繼承BindDynamicDataSourceByUserIdentifier類,并完成相關(guān)的方法重寫。
import com.ycj.fastframe.dynamicds.aop.BindDynamicDataSourceByUserIdentifier;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @author: Frank
* @email 1320259466@qq.com
* @date: 2019/11/16
* @time: 14:00
* @fuction: about the role of class.
*/
@Aspect
@Order(-1)//保證在@Transactional之前執(zhí)行
@Component
public class TestDynamicDataSource extends BindDynamicDataSourceByUserIdentifier {
@Override
@Pointcut("execution(public * com.ycj.fastframe.controller..*.*(..))")
public void dataSourceAspectPath() {
}
@Override
public void logPrint(String msg) {
System.out.println(msg);
}
@Override
public int initCacheSize() {
return 100;
}
@Override
public String setDataSouceForUser(String userUniqueIdentifier) {
if (userUniqueIdentifier.contains("1001")){
return "project1";
}else if (userUniqueIdentifier.contains("1002")){
return "project2";
}else {
return "dataSource";
}
}
@Override
public String getUserUniqueIdentifier(HttpServletRequest request, String requestArgs) {
return request.getSession().getId();
}
public static void main(String[] args) {
}
}
四種方法
動態(tài)數(shù)據(jù)源切換有四種實現(xiàn)方式:
一、通過注解,這個最簡單
只需要繼承BindDynamicDataSourceByAnnotation類,并在controller中的每個方法前面添加 @RegisterDataSource(name = “數(shù)據(jù)源名稱”) 注解即可,如下
@Aspect
@Order(-1)//保證在@Transactional之前執(zhí)行
@Component
public class TestDynamicDataSource extends BindDynamicDataSourceByAnnotation {
}
二、通過繼承BindDynamicDataSourceByArgs類,來實現(xiàn),步驟跟上面一樣,都很簡單。
三、通過繼承BindDynamicDataSourceByRequest類,來實現(xiàn),步驟跟上面一樣,都很簡單。
四、通過繼承BindDynamicDataSourceByUserIdentifier類,來實現(xiàn),步驟跟上面一樣,都很簡單。
原文鏈接:https://blog.csdn.net/u014374009/article/details/103108025
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子集和问题 算法_子集问题 主要是去重算
- 下一篇: controller调用另一个contr