jdbc java,Spring-jdbc-AbstractRoutingDataSource

 2023-10-15 阅读 30 评论 0

摘要:本文論述AbstractRoutingDataSource這個抽象類,從這個抽象類的注釋中,可以看出這個類有3個特點 jdbc java,1.這個類是一個DataSource接口的實現,所以該類,或者子類,是個DaataSource 2.可以根據不同的條件,獲取不同的DataSource 3.

本文論述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方法,所以現實中使用的時候一定要調用該方法

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/137142.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息