电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:11日期: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
相關文章:
主站蜘蛛池模板: 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 影合社-影视人的内容合作平台| 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 广西正涛环保工程有限公司【官网】 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 济南铝方通-济南铝方通价格-济南方通厂家-山东鲁方通建材有限公司 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 河南中专学校|职高|技校招生-河南中职中专网 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 |