日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中的DataSource

發(fā)布時間:2023/12/20 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中的DataSource 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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的方法如下:
@Configuration @Data @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceConfig {private String url;private String username;private String password;private String driverClassName;@Beanpublic DriverManagerDataSource driverManagerDataSource(){DriverManagerDataSource source = new DriverManagerDataSource();source.setUrl(url);source.setDriverClassName(driverClassName);source.setPassword(password);source.setUsername(username);return source;} }

org.springframework.jdbc.datasource.SingleConnectionDataSource

  • 通過IOC容器使用該singleConnectionDataSource的方法如下:
@Beanpublic SingleConnectionDataSource singleConnectionDataSource(){SingleConnectionDataSource source = new SingleConnectionDataSource();source.setUrl(url);source.setDriverClassName(driverClassName);source.setPassword(password);source.setUsername(username);//可以設(shè)置是否開啟自動提交---默認(rèn)為truesource.setAutoCommit(true);//close方法調(diào)用,也不會關(guān)閉連接source.setSuppressClose(false);return source;}

擁有連接緩沖池的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中的簡單使用如下:

public class Main {public static void main(String[] args) {DataSource mainDataSource = getMainDataSource();JdbcTemplate main=new JdbcTemplate(mainDataSource);DataSource otherDataSource = getOtherDataSource();JdbcTemplate other = new JdbcTemplate(otherDataSource);}private static javax.sql.DataSource getMainDataSource() {BasicDataSource basicDataSource = new BasicDataSource();YamlUtil yamlUtil = new YamlUtil("application.yml");basicDataSource.setDriverClassName(yamlUtil.get("spring.datasource.driver-class-name"));basicDataSource.setUrl(yamlUtil.get("spring.datasource.url"));basicDataSource.setUsername(yamlUtil.get("spring.datasource.username"));basicDataSource.setPassword(yamlUtil.get("spring.datasource.password"));return basicDataSource;}private static javax.sql.DataSource getOtherDataSource() {//如何獲取看具體的業(yè)務(wù)需求...return basicDataSource;} }

只需要不同的JdbcTemplate擁有不同的DataSource即可。


合作連橫的多數(shù)據(jù)源



AbstractRoutingDataSource原理:

  • getConnection方法會調(diào)用determineTargetDataSource來動態(tài)獲得一個數(shù)據(jù)庫連接
@Overridepublic Connection getConnection() throws SQLException {return determineTargetDataSource().getConnection();}
  • determineTargetDataSource根據(jù)determineCurrentLookupKey返回值決定從dataSource集合中選擇哪一個DataSource
protected DataSource determineTargetDataSource() {Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");//determineCurrentLookupKey抽象方法,負(fù)責(zé)返回指定的key,然后去集合中動態(tài)獲取到目標(biāo)的dataSourceObject lookupKey = determineCurrentLookupKey();DataSource dataSource = this.resolvedDataSources.get(lookupKey);if (dataSource == null && (this.lenientFallback || lookupKey == null)) {dataSource = this.resolvedDefaultDataSource;}if (dataSource == null) {throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");}return dataSource;}
  • 存儲dataSource的map集合
@Nullableprivate Map<Object, Object> targetDataSources;

這里演示一下使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。