当前位置: 首页 > news >正文

通信网站模板矿区网站建设

通信网站模板,矿区网站建设,ssh框架可以做网站么,装修房子的风格设计图软件背景 随着互联网应用的快速发展#xff0c;多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能#xff0c;成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例#xff0c;详细介绍如何在 Spring Boot 应用中实现动态数据源切换#xff0c;帮…背景 随着互联网应用的快速发展多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例详细介绍如何在 Spring Boot 应用中实现动态数据源切换帮助开发者高效应对不同业务场景下的数据管理需求。无论是读写分离还是数据隔离都能轻松搞定。 AOP动态代理 AOP注解 Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) public interface TargetDataSource {String name(); } AOP切面类 Aspect Component public class DataSourceAspect {Pointcut(annotation(com.example.aliyunai.db.TargetDataSource))public void dataSourcePointcut() {}Before(dataSourcePointcut())public void changeDataSource(JoinPoint point) {MethodSignature signature (MethodSignature) point.getSignature();Method method signature.getMethod();TargetDataSource targetDataSource method.getAnnotation(TargetDataSource.class);if (targetDataSource ! null) {String dataSourceName targetDataSource.name();DataSourceContextHolder.setDataSourceKey(dataSourceName);}}After(dataSourcePointcut())public void clearDataSource(JoinPoint point) {DataSourceContextHolder.clearDataSourceKey();} } 数据源配置 Configuration public class DataSourceConfig {Bean(name master)public DataSource primaryDataSource() {return DataSourceBuilder.create().type(HikariDataSource.class).driverClassName().url().username().password().build();}Bean(name slave)public DataSource secondaryDataSource() {return DataSourceBuilder.create().type(HikariDataSource.class).driverClassName().url().username().password().build();}Bean(name dynamicDataSource)Primarypublic DynamicDataSource dynamicDataSource(Qualifier(master) DataSource master,Qualifier(slave) DataSource slave) {MapObject, Object targetDataSources new HashMap();targetDataSources.put(master, master);targetDataSources.put(slave, slave);DynamicDataSource dynamicDataSource new DynamicDataSource();dynamicDataSource.setTargetDataSources(targetDataSources);dynamicDataSource.setDefaultTargetDataSource(master);return dynamicDataSource;}} 线程上下文 public class DataSourceContextHolder {private static final ThreadLocalString contextHolder new ThreadLocal();public static void setDataSourceKey(String key) {contextHolder.set(key);}public static String getDataSourceKey() {return contextHolder.get();}public static void clearDataSourceKey() {contextHolder.remove();} } 动态数据源设置 public class DynamicDataSource extends AbstractRoutingDataSource {private static final Logger logger LoggerFactory.getLogger(DynamicDataSource.class);Overrideprotected Object determineCurrentLookupKey() {String dataSourceKey DataSourceContextHolder.getDataSourceKey();logger.info(Determining current data source: {}, dataSourceKey);return dataSourceKey;} }service类 Service public class UserService {Resourceprivate UserMapper userMapper;TargetDataSource(name master)public User queryFromPrimary() {User user userMapper.selectById(1);return user;}TargetDataSource(name slave)public User queryFromSecondary() {User user userMapper.selectById(1L);return user;} } Mybatis 拦截器 Component Intercepts({Signature(type Executor.class, method query, args {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),Signature(type Executor.class, method update, args {MappedStatement.class,Object.class})}) public class DynamicDataSourceInterceptor implements Interceptor {private static final Logger logger LoggerFactory.getLogger(DynamicDataSourceInterceptor.class);// 假设这里有一个获取当前数据源标识的方法你需要根据实际项目中的实现来替换private String getCurrentDataSourceKey() {// 示例从某个上下文持有者中获取数据源标识这里只是示意实际要替换return DataSourceContextHolder.getDataSourceKey();}Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement (MappedStatement) invocation.getArgs()[0];Object parameter invocation.getArgs()[1];BoundSql boundSql mappedStatement.getBoundSql(parameter);String sql boundSql.getSql();//对单个表进行处理logger.info(sql:sql);String mappedStatementId mappedStatement.getId();//对所有查询进行处理if (mappedStatementId.contains(query)) {String table getTable(sql);if (table.equals(user)){DataSourceContextHolder.setDataSourceKey(getCurrentDataSourceKey());}//增删改}else if (mappedStatementId.contains(update)) {DataSourceContextHolder.setDataSourceKey(getCurrentDataSourceKey());}return invocation.proceed();}Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}private static String getTable(String sql) {// 定义正则表达式模式用于匹配 from 和 where 之间的表名Pattern pattern Pattern.compile(FROM\\s(\\w)\\sWHERE);Matcher matcher pattern.matcher(sql);if (matcher.find()) {return matcher.group(1);}return null;} }
http://www.dnsts.com.cn/news/8625.html

相关文章:

  • 如何让搜索引擎不收录网站商品推广与营销的方式
  • 免费下载ppt模板网站推荐做网站和网页有什么区别
  • 做公司网站怎么做手机版软件开发专业哪个学校好
  • 微信网站建设公司企业信用公示信息网
  • 外包做的网站可以直接去收录吗下载上海发布官方网站
  • 做刷票的网站企业网站首页布局设计
  • 单机网页游戏网站网页界面设计要中重点掌握
  • 原油可以取什么做标题发网站东莞官方网站建设
  • 做淘口令网站个人网站不备案可以吗
  • 静态网站怎么更新自己怎么制作logo图标
  • 甘肃网站建设方案服务至上无锡新吴区住房和建设交通局网站
  • 阿里云重新备案注销主体还是注销网站php网站做语言包
  • 做阿里巴巴网站图片尺寸百度云盘做网站
  • 问答社区网站建设怎样可以有自己的网站
  • 福州网站制作维护公司网页制作模板图片
  • 徐州市城乡建设局网站6外贸网站源码多语言
  • 霸屏网站开发十大酒店管理系统
  • 深圳企业网站建设价格wordpress setup_theme
  • 怎么样做一家卖东西的网站会展策划与管理
  • 沈阳网站设计福州百度推广排名
  • 长宁免费网站制作wordpress搜索筛选
  • 网站的目标定位有哪些不封号的电销系统
  • 拓普网站建设百度seo排名在线点击器
  • 平台类网站制作公司wordpress 微博同步
  • 做平面有什么好的网站北京市文化局政务网站建设项目
  • 免费网站建设模版云盘网站模版如何使用
  • 如何申请网站怎么在百度免费推广
  • 南京做网站团队安徽六安怎么读
  • 做网站推广前途网站开发(源代码)
  • 嘉兴高端网站公司公众号运营方案