博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 多数据源动态切换
阅读量:6854 次
发布时间:2019-06-26

本文共 5605 字,大约阅读时间需要 18 分钟。

  hot3.png

beans.xml

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
   
    
        
       
 

DynamicDataSource.java

import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource { Logger log = Logger.getLogger("DynamicDataSource"); private Map
 _targetDataSources; @Override protected Object determineCurrentLookupKey() {  String dataSourceName = DbContextHolder.getDBType();  if (dataSourceName == null) {   dataSourceName = "dataSource";  } else {   this.selectDataSource(dataSourceName);   if (dataSourceName.equals("0"))    dataSourceName = "dataSource";  }  log.debug("--------> use datasource " + dataSourceName);  return dataSourceName; } public void setTargetDataSources(Map
 targetDataSources) {  this._targetDataSources = targetDataSources;  super.setTargetDataSources(this._targetDataSources);  afterPropertiesSet(); } public void addTargetDataSource(String key, BasicDataSource dataSource) {  this._targetDataSources.put(key, dataSource);  this.setTargetDataSources(this._targetDataSources); } public BasicDataSource createDataSource(String driverClassName, String url,   String username, String password) {  BasicDataSource dataSource = new BasicDataSource();  dataSource.setDriverClassName(driverClassName);  dataSource.setUrl(url);  dataSource.setUsername(username);  dataSource.setPassword(password);  dataSource.setTestWhileIdle(true);  dataSource.setInitialSize(1);  dataSource.setMaxActive(5);  dataSource.setMaxWait(30000);  return dataSource; }  public BasicDataSource createDataSource(Map
 jdbc) {  String dcn = jdbc.get("driverClassName");  if(StringUtils.isBlank(dcn)    ||StringUtils.isEmpty(dcn)    ||dcn.equals("null"))  {   dcn = "oracle.jdbc.driver.OracleDriver";  }  BasicDataSource dataSource = new BasicDataSource();  dataSource.setDriverClassName(jdbc.get("driverClassName"));  dataSource.setUrl(jdbc.get("url"));  dataSource.setUsername(jdbc.get("username"));  dataSource.setPassword(jdbc.get("password"));  dataSource.setTestWhileIdle(true);  dataSource.setInitialSize(1);  dataSource.setMaxActive(5);  dataSource.setMaxWait(30000);  return dataSource; } /**  * @param dataSourceName  * @describe 数据源存在时不做处理,不存在时创建新的数据源链接,并将新数据链接添加至缓存  */ public void selectDataSource(String dataSourceName) {  Object sid = DbContextHolder.getDBType();  if ("0".equals(dataSourceName)) {   DbContextHolder.setDBType("0");   return;  }  Object obj = this._targetDataSources.get(dataSourceName);  if (obj != null && sid.equals(dataSourceName)) {   DbContextHolder.setDBType(dataSourceName);   return;  } else {      this.selectDataSource("0");   Connection conn = null;   try {    conn = this.getConnection();    System.out.println(conn == null);       } catch (SQLException e) {    e.printStackTrace();   }      if(conn != null)   {    try {       Map
 jdbc = new HashMap
();       PreparedStatement ps = conn                      .prepareStatement("SELECT * FROM bas_datasource WHERE DBS_ID = ?");              ps.setString(1, dataSourceName);              ResultSet rs = ps.executeQuery();              if (rs.next()) {               jdbc.put("DBS_ID", rs.getString("DBS_ID"));               jdbc.put("driverClassName","oracle.jdbc.driver.OracleDriver");               jdbc.put("url", rs.getString("URL"));               jdbc.put("username", rs.getString("USERNAME"));               jdbc.put("password", rs.getString("PASSWORD"));              }              rs.close();              ps.close();                            BasicDataSource dataSource = this.createDataSource(jdbc);     this.setDataSource(dataSourceName, dataSource);                        } catch (SQLException e) {              log.error(e);          } finally {              try {                  conn.close();              } catch (SQLException e) {                  log.error(e);              }          }   }   } } /**  * @param serverId  * @param dataSource  */ public void setDataSource(String dataSourceName, BasicDataSource dataSource) {  this.addTargetDataSource(dataSourceName, dataSource);  DbContextHolder.setDBType(dataSourceName); }}

DBCenter.java

import java.util.HashMap;import java.util.Map;import org.apache.commons.dbcp.BasicDataSource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import zh.Dao.CampusDao; @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath*:beans.xml"}) public class DBCenter {   @Autowired private CampusDao campusDao;   @Test  public void testCampusAll() {     System.out.println("傻逼");  System.out.println(campusDao.findAll().get(0));  DbContextHolder.setDBType("dataSource2");  System.out.println(campusDao.findAll().get(0));  DbContextHolder.setDBType("dataSource1");  System.out.println(campusDao.findAll().get(0));   }

转载于:https://my.oschina.net/body/blog/478508

你可能感兴趣的文章
Nginx代理Tomcat
查看>>
Apache与Tomcat的区别
查看>>
mysql—Access denied for user 'root'@'localhost' (using password:NO)
查看>>
hibernate 懒加载异常
查看>>
python3的zip函数
查看>>
《Git权威指南》读书笔记 第四章 git初始化
查看>>
《Head first HTML与CSS 第二版》读书笔记 第九章 盒模型
查看>>
《Python面向对象……》之目录
查看>>
集群入门简析及LB下LVS详解
查看>>
Linux与GPT
查看>>
管理或技术
查看>>
分配到弱属性;对象将在赋值之后释放
查看>>
java作用域public ,private ,protected 及不写时的区别
查看>>
until循环语句
查看>>
Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现
查看>>
提高用户体验方式:饥饿营销
查看>>
Java8中的LocalDateTime工具类
查看>>
Exchange 2013 PowerShell创建自定义对象
查看>>
RAID-10 阵列的创建(软)
查看>>
javaScript的调试(四)
查看>>