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

通信网站模板网站建设备案

通信网站模板,网站建设备案,网站分几种类型,一个网站的建设步骤背景 随着互联网应用的快速发展#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.laogonggong.com/news/134141.html

相关文章:

  • 松江区网站建设公司网络文化经营许可证价格
  • 电商网站平台建设资金预算网站工作室
  • 新手怎么优化网站如何做adsense网站
  • 汽车用品网站附近cad制图培训班
  • 延安网站建设公司建设网站审批
  • 泉州做网站做蔬菜的网站有哪些
  • 海阳网网站设计相关网站
  • 网站服务器搭建XP网站权重2的网站
  • 爱网站在线观看视频中国科技成就的例子
  • 布吉网站建设找哪家公司好承包网站开发
  • 新乡电商网站建设如何查看一个网站流量
  • 网站左侧悬浮导航有声小说网站开发
  • 网站系统定制北京朝阳网站制作
  • 高大上网站欣赏中信建设有限责任公司深圳中信金融中心项目工期专业招标
  • 做搜狗网站优化点权威的扬中网站建设
  • 如何查看网站用什么代码做的关于合肥的网站好
  • 网站开发定制合同wordpress 网站建设中
  • 买服务器网站安卓开发为什么不火了
  • iis网站权限设置wordpress中文
  • 网站的建设思路上海有哪些建设工程公司
  • 个人做视频网站wordpress 远程管理
  • 网站建设手机端管网网站后台管理系统代码
  • 网站文化建设房地产建设企业网站
  • 黔西做网站苏州关键词优化公司
  • 如何建设国外网站erp管理系统官网
  • 常德企业网站建设网站推广的几种方法
  • ci框架建设网站wordpress简约模板
  • 成都校园兼职网站建设十大计算机培训学校
  • 天津网站建设服务好阜阳集团网站建设
  • 网站开发需求文档案例北京档案馆网站建设