日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring AbstractRoutingDatasource 動態數據源的實例講解

瀏覽:22日期:2023-06-30 13:18:08
Spring AbstractRoutingDatasource 動態數據源數據源上下文

AbstractRoutingDatasource 需要信息決定路由到那個數據源,該信息我們稱為上下文。可以市任何對象,下面示例我們使用枚舉 ClientDatabase 作為上下文:

public enum ClientDatabase { CLIENT_A, CLIENT_B}

值得注意的是,實際中上下文可以是任何有意義的領域對象。如 Environment 定義上下文,在這種上下文中枚舉可以包括 PRODUCTION, DEVELOPMENT, and TESTING.

上下文持有者 ( ContextHolder )

上下文持有者實現是存儲當前上下文的容器,如 ThreadLocal 對象。除了包括上下文引用外,還應該包括set , get , clear 靜態方法,AbstractRoutingDatasource 將查詢 ContextHolder 獲得 上下文,然后使用上下文查找實際的數據源。

這里最重要的是使用 ThreadLocal ,讓上下文綁定只當前執行線程。使用這種方法就是為了保障當數據訪問邏輯跨多個數據源使用事務:

public class ClientDatabaseContextHolder { private static ThreadLocal<ClientDatabase> CONTEXT = new ThreadLocal<>(); public static void set(ClientDatabase clientDatabase) {Assert.notNull(clientDatabase, 'clientDatabase cannot be null');CONTEXT.set(clientDatabase); } public static ClientDatabase getClientDatabase() {return CONTEXT.get(); } public static void clear() {CONTEXT.remove(); }}數據源路由器

下面定義 ClientDataSourceRouter 繼承 AbstractRoutingDataSource. 重寫方法 determineCurrentLookupKey ,查詢 ClientDatabaseContextHolder 獲得當前 上下文。AbstractRoutingDataSource 幫我們處理了其他邏輯,僅了解它透明地返回了合適的數據源:

public class ClientDataSourceRouter extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() {return ClientDatabaseContextHolder.getClientDatabase(); }}配置

下面利用Map上下文存儲DataSource對象,用于配置 AbstractRoutingDataSource 。當然也可以指定缺省數據源,當沒有設定上下文時選擇缺省數據源。

@Configurationpublic class RoutingTestConfiguration { @Bean public ClientService clientService() {return new ClientService(new ClientDao(clientDatasource())); } @Bean public DataSource clientDatasource() {Map<Object, Object> targetDataSources = new HashMap<>();DataSource clientADatasource = clientADatasource();DataSource clientBDatasource = clientBDatasource();targetDataSources.put(ClientDatabase.CLIENT_A, clientADatasource);targetDataSources.put(ClientDatabase.CLIENT_B, clientBDatasource);ClientDataSourceRouter clientRoutingDatasource = new ClientDataSourceRouter();clientRoutingDatasource.setTargetDataSources(targetDataSources);clientRoutingDatasource.setDefaultTargetDataSource(clientADatasource);return clientRoutingDatasource; } // ...}

我們可以使用不同方式的數據源,但典型場景時運行時創建,或使用JNDI方式查找。下面定義示例的Dao類,它依賴動態數據源進行實例化:

public class ClientDao { private static final String SQL_GET_CLIENT_NAME = 'select name from client'; private final JdbcTemplate jdbcTemplate; public ClientDao(DataSource datasource) {this.jdbcTemplate = new JdbcTemplate(datasource); } public String getClientName() {return this.jdbcTemplate.query(SQL_GET_CLIENT_NAME, rowMapper).get(0); } private static RowMapper<String> rowMapper = (rs, rowNum) -> {return rs.getString('name'); };}使用動態數據源

實際使用時,首先設置上下文,然后再執行業務操作。我們定義業務層,其中業務方法包括上下文作為參數。在執行業務之前設置上下文,調用之后清除上下文:

public class ClientService { private final ClientDao clientDao; public ClientService(ClientDao clientDao) {this.clientDao = clientDao; } public String getClientName(ClientDatabase clientDb) {ClientDatabaseContextHolder.set(clientDb);String clientName = this.clientDao.getClientName();ClientDatabaseContextHolder.clear();return clientName; }}總結

本文通過示例解釋如何使用 Spring AbstractRoutingDataSource 實現 動態數據源切換。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品韩国| 亚洲色图综合| 久久精品国产999大香线蕉| 国产日产一区| 国产一区二区三区四区二区| 特黄毛片在线观看| 99久精品视频在线观看视频| 日本高清不卡一区二区三区视频 | 蜜桃成人av| 99国产精品99久久久久久粉嫩| 石原莉奈在线亚洲二区| 日韩超碰人人爽人人做人人添| 国产精品一国产精品k频道56| 韩日一区二区| 91久久久精品国产| 日韩av三区| 成人精品高清在线视频| 欧美一区二区三区激情视频| 免费观看日韩电影| 欧美a在线观看| 欧美成人亚洲| 综合国产精品| 精品视频在线观看网站| 国产在线日韩| 欧美一区二区三区久久精品| 国产成人精品一区二区三区在线| 日本精品在线中文字幕| 天堂成人国产精品一区| 免费在线播放第一区高清av| 久久在线免费| 欧美亚洲一区二区三区| 亚洲一级少妇| 日韩av不卡在线观看| 麻豆精品蜜桃| 国产日韩欧美在线播放不卡| 99久久视频| 日本在线一区二区三区| 日韩大片在线观看| 在线精品福利| av资源亚洲| 日本三级亚洲精品| 亚洲性视频h| 麻豆精品国产91久久久久久| 99pao成人国产永久免费视频 | 欧美日韩视频网站| 蜜桃视频在线观看一区| 91日韩欧美| 中文字幕免费一区二区| 国产v日韩v欧美v| 日本成人在线视频网站| 免费视频亚洲| 国产精品一区二区三区四区在线观看| 蜜臀91精品国产高清在线观看| 欧美视频二区| 免费在线看一区| 日韩精品2区| 国产精品巨作av| 在线国产精品一区| 精品中文字幕一区二区三区av| 欧美aa在线视频| 日本成人一区二区| 99在线精品免费视频九九视| 激情视频网站在线播放色| 日本午夜精品久久久久| 久久福利一区| 亚洲午夜久久久久久尤物 | 蜜桃视频一区二区三区| 久久久精品日韩| 日韩88av| 你懂的国产精品| 日本午夜免费一区二区| 先锋影音久久久| 黄色不卡一区| 日韩免费在线| 国内揄拍国内精品久久| 国产激情久久| 日韩欧美四区| 日本亚州欧洲精品不卡| 老牛国产精品一区的观看方式| 欧美高清一区| 99久久激情| 亚洲成人二区| 欧美午夜精品一区二区三区电影| 天堂中文在线播放| 国产精品高颜值在线观看| 黄色网一区二区| 国产精品99视频| 国产成人精选| 色婷婷综合网| 亚洲天堂免费电影| 99精品小视频| 亚洲成a人片| 日韩在线短视频| 欧美gv在线| 精品捆绑调教一区二区三区| 日韩电影免费在线观看| 日韩一区二区在线免费| 亚洲天堂av影院| 日韩成人亚洲| 亚洲精品网址| 久久亚洲国产精品一区二区| 亚洲一卡久久| 色8久久久久| 91亚洲无吗| 久久中文精品| 日韩免费高清| 在线一区视频观看| 婷婷亚洲综合| 免费欧美日韩| 日韩中出av| 麻豆一区二区99久久久久| 高潮久久久久久久久久久久久久| 91视频一区| 国产综合精品| 三级欧美在线一区| 欧美日本久久| 国产不卡人人| 亚洲免费成人| 日韩1区2区日韩1区2区| 久久伊人亚洲| 久久精品亚洲人成影院 | 国产精品白丝久久av网站| 蜜桃精品视频| 亚洲91久久| 亚洲综合激情在线| 久久av超碰| 激情久久五月| 日韩av影院| 97精品国产福利一区二区三区| 久久精品99久久无色码中文字幕| 国产色综合网| 国产精品黄色片| 久久中文字幕av| 日韩国产一二三区| 久久精品三级| 欧美在线亚洲| 欧美伊人影院| 国产91久久精品一区二区| 日韩美女国产精品| 超碰成人av| 一区二区国产精品| 97精品国产一区二区三区| 国产亚洲精品v| 国产精品高清一区二区| 尤物tv在线精品| 国产精品久久久久久妇女| 国内精品福利| 欧美激情久久久久久久久久久| 黄色免费成人| 欧美视频久久| 国产尤物精品| 精品国产欧美| 欧美资源在线| 中文在线免费视频| 日韩一区精品| 日韩中文首页| 日韩黄色av| 亚洲一级高清| 麻豆一区在线| 亚洲精品一区二区在线播放∴| 日韩毛片视频| 国产亚洲字幕| 视频在线在亚洲| 99精品国产一区二区三区| 日本va欧美va精品发布| 久久视频国产| 美女国产一区二区三区| 免费人成精品欧美精品| 免费在线小视频| 国产亚洲久久| 美国三级日本三级久久99 | 黑森林国产精品av| 欧美日韩视频免费看| 久久国产精品久久久久久电车| 国产一区二区三区亚洲综合| 日韩精品一级| 亚洲一区激情| 成人精品亚洲| 久久精品九色| 国产精品久久久久久久久久久久久久久 | 久久午夜影院| 日韩黄色av| 美女日韩在线中文字幕| 欧美特黄一级大片| 在线一区av| 精品一区二区三区视频在线播放| 无码日韩精品一区二区免费| 国产精品日本欧美一区二区三区| 日韩和的一区二在线| 超碰在线99| 国产一区二区三区日韩精品| 日韩成人av影视| 亚洲色图国产| 亚洲在线网站| 国产农村妇女精品一区二区| 欧美99久久| 不卡视频在线| 免费久久精品| 欧美在线影院| 亚洲免费观看|