spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换
生活随笔
收集整理的這篇文章主要介紹了
spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:碼農教程
出自:碼農教程
原文:manongjc.com/detail/14-ucsldoihyzmwcui.html
當項目中存在多數據源時,就涉及到數據源的動態切換,通過研究,特此記錄一下。
1,maven依賴
<!-數據庫連接-> <依賴性><groupId> com.oracle </ groupId><artifactId> ojdbc6 </ artifactId><version> 11.2.0.4 </ version><scope>運行時</ scope></ dependency> <!-數據庫連接池-> <依賴性><groupId> com.alibaba </ groupId><artifactId> druid-spring-boot-starter </ artifactId><version> 1.1.10 </ version></ dependency><依賴性><groupId> org.springframework.boot </ groupId><artifactId> spring-boot-starter-jdbc </ artifactId></ dependency> <!-aop-> <依賴性><groupId> org.springframework.boot </ groupId><artifactId> spring-boot-starter-aop </ artifactId></ dependency>2,多數據源信息配置
#多數據源測試 彈簧:數據源:德魯伊:主:驅動程序-類-名稱:oracle.jdbc.driver.OracleDriver用戶名:test密碼:測試網址:jdbc:oracle:thin:@ // ip1:1521 / orcl slave:驅動程序-類-名稱:oracle.jdbc.driver.OracleDriver用戶名:test密碼:測試網址:jdbc:oracle:thin:@ // ip2:1521 / orcl3,數據源配置信息轉換成實體類
@ConfigurationProperties(prefix =“ spring.datasource.druid” ) @數據 @零件 公共 類DataSourceProperties {私有Map <String,String> master;私有Map <String,String>從屬; }4,動態數據源切換類
公共 類DynamicDataSource擴展AbstractRoutingDataSource {私有 靜態 最終ThreadLocal <String> contextHolder = new ThreadLocal <> ();公開DynamicDataSource(DataSource defaultTargetDataSource,Map <Object,Object> targetDataSources){super .setDefaultTargetDataSource(defaultTargetDataSource);超級.setTargetDataSources(targetDataSources);超級.afterPropertiesSet();}@Override受保護的對象defineCurrentLookupKey(){return getDataSource();}公共 靜態 無效setDataSource(String dataSource){contextHolder.set(dataSource);}公共 靜態字符串getDataSource(){return contextHolder.get();}公共 靜態 無效clearDataSource(){contextHolder.remove();} }5,多數據源配置類
@Configuration 公共 類DynamicDataSourceConfig {@豆角,扁豆公共數據源主控(@Autowired DataSourceProperties dataSourceProperties){DruidDataSource druidDataSource =新的DruidDataSource();映射<String,String> master = dataSourceProperties.getMaster();druidDataSource.setUsername(master.get( “ username” ));druidDataSource.setPassword(master.get( “ password” ));druidDataSource.setUrl(master.get( “ url” ));//其他參數配置省略返回druidDataSource;}@豆角,扁豆公用DataSource從屬(@Autowired DataSourceProperties dataSourceProperties){DruidDataSource druidDataSource =新的DruidDataSource();映射<String,String> slave = dataSourceProperties.getSlave();druidDataSource.setUsername(slave.get( “ username” ));druidDataSource.setPassword(slave.get( “ password” ));druidDataSource.setUrl(slave.get( “ url” ));//其他參數配置省略返回druidDataSource;}@豆角,扁豆@主公共DynamicDataSource數據源(數據源主數據源,數據源從數據){映射<Object,Object> map = new HashMap <>(4 );map.put( “ master” ,master);map.put( “ slave” ,slave);返回 新的DynamicDataSource(master,map);} }6,自定義@DataSource注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @ interface數據源{字符串name()默認為“ master” ; }7,Aop切面類配置
@零件 @方面 公共 類DataSourceAspect {@Pointcut( “ @annotation(com.zxgeo.sso.muiltDatasource.anons.DataSource)” )公共 無效dataSourcePointCut(){}@Around(value =“ dataSourcePointCut()” )圍繞(ProceedingJoinPoint點)的公共對象拋出Throwable {MethodSignature簽名= (MethodSignature)point.getSignature();方法method = signature.getMethod();數據源的dataSource = method.getAnnotation(數據源。類);如果(dataSource == null ){DynamicDataSource.setDataSource( “ master” );}其他{DynamicDataSource.setDataSource(dataSource.name());}嘗試{return point.proceed();}最后{DynamicDataSource.clearDataSource();}} }8,啟動配置注解信息,重要(不然運行會報錯)
@SpringBootApplication(排除= {DataSourceAutoConfiguration。類})9,測試
(1),服務層(此處沒有使用mybatis)
@Service 公共 類TestService {@Autowired私有javax.sql.DataSource dataSource;@數據源公共Map <String,Object> getMasterDataSource()拋出SQLException {連接連接= dataSource.getConnection();映射<String,Object>映射;嘗試(PreparedStatement prepareStatement= connection.prepareStatement(“ SELECT * FROM AA WHERE A = 10001” )){ResultSet resultSet = prepareStatement.executeQuery ();map = new HashMap <> ();同時(resultSet.next()){map.put( “ A”,resultSet.getString(“ A” ));map.put( “ B”,resultSet.getString(“ B” ));map.put( “ C”,resultSet.getString(“ C” ));}}返回地圖}@DataSource(name =“ slave” )public Map <String,Object> getSlaveDataSource()引發SQLException {連接連接= dataSource.getConnection();映射<String,Object>映射;嘗試(PreparedStatement prepareStatement= connection.prepareStatement(“ SELECT * FROM AA WHERE A = 10002” )){ResultSet resultSet = prepareStatement.executeQuery ();map = new HashMap <> ();同時(resultSet.next()){map.put( “ A”,resultSet.getString(“ A” ));map.put( “ B”,resultSet.getString(“ B” ));map.put( “ C”,resultSet.getString(“ C” ));}}返回地圖} }(2),單元測試
@SpringBootTest @RunWith(SpringRunner。類) 類SsoApplicationTests {@Autowired私有 TestService testService;@測試公共 無效muliDatasorce()拋出SQLException {映射<String,Object> masterDataSourceUrl = testService.getMasterDataSource();System.out.println(masterDataSourceUrl);映射<String,Object> slaveDataSourceUrl = testService.getSlaveDataSource();System.out.println(slaveDataSourceUrl);} }(3),結果:
總結
以上是生活随笔為你收集整理的spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tablestore换mysql_mys
- 下一篇: mysql虚拟机远程链接_windows