本文論述AbstractRoutingDataSource這個抽象類,從這個抽象類的注釋中,可以看出這個類有3個特點
jdbc java,1.這個類是一個DataSource接口的實現,所以該類,或者子類,是個DaataSource
2.可以根據不同的條件,獲取不同的DataSource
3.上述中"不同的條件"通常是使用ThreadLocal來創建的
言外之意就是說這個類可是切換數據源,因為該類是抽象類,所以利用其特性的時候,必須自己創建一個類,然后繼承該類,下面我自己創建2個類
public class MyRoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceSelector.getDataSourceName();}
}
public class DataSourceSelector {private static final ThreadLocal<String> DATASOURC = new ThreadLocal<>();public static String getDataSourceName() {String name = DATASOURC.get();DATASOURC.remove();return name;}public static void setDataSourceName(String dataSourceName) {DATASOURC.set(dataSourceName);}
}
這兩個類很簡單,正好實現了上述所說3點中的第2點和第3點,實現了之后,具體如何使用呢?在spring中使用方式如下
public static void main(String[] args) throws SQLException {// 創建一個數據源,名字叫ds1,注意鏈接的數據庫是shiwentian_testHikariDataSource ds1 = new HikariDataSource();ds1.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/shiwentian_test");ds1.setUsername("root");ds1.setPassword("000000");// 又創建一個數據源,名字叫ds2,注意鏈接的數據庫是shiwentian_test2HikariDataSource ds2 = new HikariDataSource();ds2.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/shiwentian_test2");ds2.setUsername("root");ds2.setPassword("000000");// 將ds1和ds2這兩個數據源放到一個map中Map<Object, Object> dsMap = new HashMap<>();dsMap.put("d1", ds1);dsMap.put("d2", ds2);// new一個我們剛才創建的類,然后把裝有兩個數據源的map放進去MyRoutingDataSource routingDataSource = new MyRoutingDataSource();routingDataSource.setTargetDataSources(dsMap);// 執行初始化方法,注意此處,因為本示例代碼沒有依賴spring容器,所以不會// 自動觸發InitializingBean.afterPropertiesSet方法,所以此處手動執行一下// 假裝我們在spring的環境中routingDataSource.afterPropertiesSet();// 選擇名字叫d1的數據源,此處會將數據插到shiwentian_test庫// 如果此處選擇d2的數據源,則數據將會插入到shiwentian_test2庫DataSourceSelector.setDataSourceName("d1");Connection conn = routingDataSource.getConnection();conn.prepareStatement("insert into t1 (v1,v2) values (11,22)").executeUpdate();
}
注意:本文為了演示簡單,并沒有調用ThreadLocal的remove方法,所以現實中使用的時候一定要調用該方法
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态