javascript
Spring中的DataSource
Spring中的DataSource
- DataSource的種類
- 簡單的DataSource實現(xiàn)
- 擁有連接緩沖池的DataSource實現(xiàn)
- 支持分布式事務(wù)的DataSource
- 自定義DataSource
- 多數(shù)據(jù)源
- 主權(quán)獨立的數(shù)據(jù)源
- 合作連橫的多數(shù)據(jù)源
- 小結(jié)
DataSource的種類
DataSource的基本角色是ConnectionFactory,所有的數(shù)據(jù)庫連接將通過DataSource接口統(tǒng)一管理。
DataSource實現(xiàn)類根據(jù)功能強弱可以劃分為以下三類:
簡單的DataSource實現(xiàn)
org.springframework.jdbc.datasource.DriverManagerDataSource.
顧名思義,DriverManagerDataSource的提出,主要是為了替換最古老的基于java.sql.DriverManager獲取連接的方式。
Class.forName("com.mysql.jdbc.Driver");DriverManager.getConnection("jdbc:mysql://110.40.155.17:3306/test?userSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8","root","126433");- DriverManagerDataSource的類結(jié)構(gòu)繼承圖如下
- 通過IOC容器使用該DriverManagerDataSource的方法如下:
org.springframework.jdbc.datasource.SingleConnectionDataSource
- 通過IOC容器使用該singleConnectionDataSource的方法如下:
擁有連接緩沖池的DataSource實現(xiàn)
常見的數(shù)據(jù)庫連接池有cp30,driud等,這需要引入額外的依賴,這里不多進(jìn)行演示。
對于這類DataSource,還需要額外指定連接池大小等參數(shù)。
支持分布式事務(wù)的DataSource
自定義DataSource
Spring提供了DelegatingDataSource的幾個實現(xiàn)類
多數(shù)據(jù)源
主權(quán)獨立的數(shù)據(jù)源
所謂主權(quán)獨立是指系統(tǒng)中的每個數(shù)據(jù)源都對外獨立承擔(dān)公開數(shù)據(jù)庫資源的職能:
該種數(shù)據(jù)源在spring中的簡單使用如下:
只需要不同的JdbcTemplate擁有不同的DataSource即可。
合作連橫的多數(shù)據(jù)源
AbstractRoutingDataSource原理:
- getConnection方法會調(diào)用determineTargetDataSource來動態(tài)獲得一個數(shù)據(jù)庫連接
- determineTargetDataSource根據(jù)determineCurrentLookupKey返回值決定從dataSource集合中選擇哪一個DataSource
- 存儲dataSource的map集合
這里演示一下使用AbstractRoutingDataSource實現(xiàn)多數(shù)據(jù)源的管控:
@Data public class DynamicDataSource extends AbstractRoutingDataSource {private String datasource;@Overrideprotected Object determineCurrentLookupKey() {return datasource;} } public class DataSourceTestHandler {/*** 獲得helper數(shù)據(jù)庫的數(shù)據(jù)源*/public static DataSource getHelperDataSource(){HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("xxx");dataSource.setUsername("xxx");dataSource.setPassword("xxx");return dataSource;}/*** 獲得training數(shù)據(jù)庫的數(shù)據(jù)源*/public static DataSource getTrainingDataSource(){HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("xxx");dataSource.setUsername("xxx");dataSource.setPassword("xxx");return dataSource;}public static DataSource getManagerDataSource(){DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object,Object> sources=new HashMap<>();sources.put("helper",getHelperDataSource());sources.put("training",getTrainingDataSource());dynamicDataSource.setTargetDataSources(sources);return dynamicDataSource;} }動態(tài)切換測試:
/*** 多數(shù)據(jù)源結(jié)果測試*/@ResponseBody@GetMapping("/{dataSource}/{tableName}")public AjaxResponse testMultiplyDataSource(@PathVariable(name = "dataSource") String dataSource,@PathVariable(name = "tableName")String tableName) throws SQLException {log.info("需要進(jìn)行測試的數(shù)據(jù)源為: {}",dataSource);return testService.testMultiplyDataSource(dataSource,tableName);} @Service public class TestServiceImp implements TestService {@Overridepublic AjaxResponse testMultiplyDataSource(String dataSource,String tableName) throws SQLException {DynamicDataSource managerDataSource = (DynamicDataSource)getManagerDataSource();managerDataSource.setDatasource(dataSource);managerDataSource.afterPropertiesSet();JdbcTemplate jdbcTemplate = new JdbcTemplate(managerDataSource);List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from " + tableName);return AjaxResponse.success(list);} }
小結(jié)
合縱連橫和主權(quán)獨立可以聯(lián)合使用:
- 合縱連橫爭取主權(quán)獨立
可以用于存在多個數(shù)據(jù)源的場景,并且每個數(shù)據(jù)源存在多個實例,需要進(jìn)行負(fù)載均衡
- 主權(quán)獨立并入合縱連橫
總結(jié)
以上是生活随笔為你收集整理的Spring中的DataSource的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AF1210深信服网关配置
- 下一篇: gradle idea java ssm