首页 > 编程语言 >一对一视频聊天源码,JDBC数据源隔离方法

一对一视频聊天源码,JDBC数据源隔离方法

时间:2024-05-18 08:56:53浏览次数:22  
标签:JDBC return DynamicDataSourceContextHolder 数据源 源码 static key public

在开发一对一视频聊天源码时,数据隔离需要对DB,Redis,RabbitMQ进行数据隔离,接下来主要介绍一下JDBC数据源隔离方法。在这里插入图片描述通过实现Spring动态数据源AbstractRoutingDataSource,通过ThreadLocal识别出来压测数据,如果是压测数据就路由到影子库,如果是正常流量则路由到主库,通过流量识别的改造,各个服务都已经能够识别出压测的请求流量了。

代码实现

数据源路由Key持有对象

根据路由Key将选择将操作路由给那个数据源

/**
 * 动态数据源上下文
 */
public class DynamicDataSourceContextHolder {
    public static final String PRIMARY_DB = "primary";
    public static final String SHADOW_DB = "shadow";

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>() {
        /**
         * 将 master 数据源的 key作为默认数据源的 key
         */
        @Override
        protected String initialValue() {
            return PRIMARY_DB;
        }
    };


    /**
     * 数据源的 key集合,用于切换时判断数据源是否存在
     */
    public static List<Object> dataSourceKeys = new ArrayList<>();

    /**
     * 切换数据源
     *
     * @param key
     */
    public static void setDataSourceKey(String key) {
        contextHolder.set(key);
    }

    /**
     * 获取数据源
     *
     * @return
     */
    public static String getDataSourceKey() {
        return contextHolder.get();
    }

    /**
     * 重置数据源
     */
    public static void clearDataSourceKey() {
        contextHolder.remove();
    }

    /**
     * 判断是否包含数据源
     *
     * @param key 数据源key
     * @return
     */
    public static boolean containDataSourceKey(String key) {
        return dataSourceKeys.contains(key);
    }

    /**
     * 添加数据源keys
     *
     * @param keys
     * @return
     */
    public static boolean addDataSourceKeys(Collection<? extends Object> keys) {
        return dataSourceKeys.addAll(keys);
    }
}

 

动态数据源实现类

根据路由Key实现数据源的切换

/**
 * 动态数据源实现类
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 如果不希望数据源在启动配置时就加载好,可以定制这个方法,从任何你希望的地方读取并返回数据源
     * 比如从数据库、文件、外部接口等读取数据源信息,并最终返回一个DataSource实现类对象即可
     */
    @Override
    protected DataSource determineTargetDataSource() {
        //获取当前的上下文
        WormholeContext wormholeContext = WormholeContextHolder.getContext();
        //如果不为空使用影子库
        if (null != wormholeContext) {
            DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.SHADOW_DB);
        } else {
            //为空则使用主数据源
            DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.PRIMARY_DB);
        }
        return super.determineTargetDataSource();
    }

    /**
     * 如果希望所有数据源在启动配置时就加载好,这里通过设置数据源Key值来切换数据,定制这个方法
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceKey();
    }

 
}

 

以上就是一对一视频聊天源码,JDBC数据源隔离方法, 更多内容欢迎关注之后的文章

 

标签:JDBC,return,DynamicDataSourceContextHolder,数据源,源码,static,key,public
From: https://www.cnblogs.com/yunbaomengnan/p/18199013

相关文章

  • 一对一视频源码,Redis数据源还能这样隔离
    一对一视频源码,Redis数据源还能这样隔离通过ThreadLocal识别出来压测数据,自定义Redis的主键的序列化方式,如果是压测数据则在主键后面加上后缀,这样就可以通过不同主键将Redis数据进行隔离。一、实现key序列化publicclassKeyStringRedisSerializerextendsStringRedis......
  • JDBC学习
    简介:JDBC(JavaDatabaseConnectivity  :Java数据库连接)       概念: 使用Java语言操作关系型数据库的一套API       作用:同一套Java代码,操作不同的关系型数据库JDBC就是一套标准接口  基础代码://1.创建工程,导入驱动jar包//2.注册驱......
  • kubernetes 源码开启 go work 模式
    为了更方便进行go项目多模块管理,go社区在gomod之后引入了go workspaces模式。kubernetes社区最近在 kubernetes源码中启用 go workspaces模式。go提出 go workspaces模式的issue,和社区 thockin 的关注 cmd/go:supportvendoringinworkspacemode·Is......
  • kubernetes DeploymentController 源码解析
    DeploymentController对象从 NewDeploymentController方法开始创建,我们首先看这个方法1//NewDeploymentControllercreatesanewDeploymentController.2funcNewDeploymentController(ctxcontext.Context,dInformerappsinformers.DeploymentInformer,rsInformer......
  • springboot集成@DS注解实现数据源切换(转载)
    springboot集成@DS注解实现数据源切换启用@DS实现数据源切换POM内添加核心jar包yml配置"核心"-使用@DS注解最后启用@DS实现数据源切换POM内添加核心jar包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-start......
  • 通过mybatisflex获取多数据源mapper
    基于mybatisflex1.8.4:@NoArgsConstructor(access=AccessLevel.PRIVATE)@Slf4jpublicclassDataSource{publicstaticfinalStringA="a";publicstaticfinalStringB="b";publicstaticfinalStringC="c";pub......
  • DuckDB 源码配置
    DuckDB源码配置源码编译sudoapt-getupdate&&sudoapt-getinstall-ygitg++cmakeninja-buildlibssl-devgitclonegit@github.com:duckdb/duckdb.gitcdduckdbmakedebug/releaseissue当我们编译debug版本的时候可能会出现如下图所示的问题:调试配置{/......
  • openGauss JDBC常用参数参考
    JDBC常用参数参考targetServerType原理:值为master时会依次尝试连接串中配置的ip,直到能够连接到集群中的主机,值为slave时会依次尝试连接串中配置的ip,直到能够连接到集群中的备机(查询语句为:selectlocal_role,db_statefrompg_stat_get_stream_replications();)。建议:有写操......
  • openGauss JDBC包-驱动类和环境类
    JDBC包、驱动类和环境类JDBC包openGauss提供两种JDBCjar包:postgresql.jar和openGauss-jdbc-x.x.x.jar,两种jar包功能一致,仅仅是为了解决和PostgreSQL之间的JDBC驱动包名冲突。在Linux服务器端源代码目录下执行build.sh,获得驱动jar包postgresql.jar和opengauss-jdbc-x.x.x.jar,包......
  • openGauss JDBC配置
    JDBC配置目前,openGauss相关的第三方工具都是通过JDBC进行连接的,此部分将介绍工具配置时的注意事项。连接参数【关注】第三方工具通过JDBC连接openGauss时,JDBC向openGauss发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。params={{"user"......