返回顶部
首页 > 资讯 > 数据库 >Mycat 连接池模型源码
  • 843
分享到

Mycat 连接池模型源码

2024-04-02 19:04:59 843人浏览 安东尼
摘要

PhysicalDBnode 是Mycat集群(Datanode)的对应,引用一个连接池对象 PhysicalDBPool,PhysicalDBPool 里面引用了真正的连接池对象 PhysicalData

PhysicalDBnode 是Mycat集群(Datanode)的对应,引用一个连接池对象 PhysicalDBPool,
PhysicalDBPool 里面引用了真正的连接池对象 PhysicalDatasource,PhysicalDBPool 里面把该
集群的读节点,写节点写入各自的 PhysicalDatasource 数组,通过负载均衡决定走哪个节点
负载均衡策略:随机选择,按权重设置随机概率
代码:randomSelect
节点权重计算公式String weightStr = node.getAttribute("weight");
int weight = "".equals(weightStr) ? PhysicalDBPool.WEIGHT : Integer.parseInt(weightStr) ;
负载均衡:offset -= okSources.get(i).getConfig().getWeight();
没明白为什么这么分配,难道可用达到权重越大,分配可能性越小???

public PhysicalDatasource randomSelect(ArrayList<PhysicalDatasource> okSources) {

   if (okSources.isEmpty()) {
      return this.getSource();

   } else {      

      int length = okSources.size();     // 总个数
        int totalWeight = 0;         // 总权重
        boolean sameWeight = true;        // 权重是否都一样
        for (int i = 0; i < length; i++) {            
            int weight = okSources.get(i).getConfig().getWeight();
            totalWeight += weight;        // 累计总权重               
            if (sameWeight && i > 0 
                  && weight != okSources.get(i-1).getConfig().getWeight() ) {      // 计算所有权重是否一样                              
                sameWeight = false;    
            }
        }

        if (totalWeight > 0 && !sameWeight ) {

           // 如果权重不相同且权重大于0则按总权重数随机
            int offset = random.nextInt(totalWeight);

            // 并确定随机值落在哪个片断上
            for (int i = 0; i < length; i++) {
                offset -= okSources.get(i).getConfig().getWeight();
                if (offset < 0) {
                    return okSources.get(i);
                }
            }
        }

        // 如果权重相同或权重为0则均等随机
        return okSources.get( random.nextInt(length) );    

      //int index = Math.abs(random.nextInt()) % okSources.size();
      //return okSources.get(index);
   }
}

PhysicalDatasource 连接池对象保存该连接的可用连接使用的数据结构是,ConMap,主要功能是获取当前节点的可用连接,首先从当前database上获取可用连接,如果没有,则从其他 database 上获取可用连接

public BackendConnection tryTakeCon(final String schema, boolean autoCommit) {
   final ConQueue queue = items.get(schema);
   BackendConnection con = tryTakeCon(queue, autoCommit);
   if (con != null) {
      return con;
   } else {
      for (ConQueue queue2 : items.values()) {
         if (queue != queue2) {
            con = tryTakeCon(queue2, autoCommit);
            if (con != null) {
               return con;
            }
         }
      }
   }
   return null;

}
private BackendConnection tryTakeCon(ConQueue queue, boolean autoCommit) {

   BackendConnection con = null;
   if (queue != null && ((con = queue.takeIdleCon(autoCommit)) != null)) {
      return con;
   } else {
      return null;
   }

}

database的可用连接是存放在数据结构ConQueue中的,可用连接分为自动提交,手动提交,所以ConQueue由2个ConcurrentLinkedQueue组成,autoCommitCons 自动提交队列,manCommitCons 手动提交队列
分配可用连接:先从提交方式队列队首分配,分配失败,从另一个队列分配,分配失败,从其他databse 分配。猜想:此处分配完成应该不是最种的可用连接,还需要做事务隔离级别、事务模式、字符集、Database 等等处理和校验,才能执行具体的 sql 指令,这些应该是在MysqlConnection 类中进行的

public BackendConnection takeIdleCon(boolean autoCommit) {
   ConcurrentLinkedQueue<BackendConnection> f1 = autoCommitCons;
   ConcurrentLinkedQueue<BackendConnection> f2 = manCommitCons;

   if (!autoCommit) {
      f1 = manCommitCons;
      f2 = autoCommitCons;

   }
   BackendConnection con = f1.poll();
   if (con == null || con.isClosedOrQuit()) {
      con = f2.poll();
   }
   if (con == null || con.isClosedOrQuit()) {
      return null;
   } else {
      return con;
   }

}
您可能感兴趣的文档:

--结束END--

本文标题: Mycat 连接池模型源码

本文链接: https://lsjlt.com/news/45459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mycat 连接池模型源码
    PhysicalDBNode 是Mycat集群(Datanode)的对应,引用一个连接池对象 PhysicalDBPool,PhysicalDBPool 里面引用了真正的连接池对象 PhysicalData...
    99+
    2024-04-02
  • Mycat 网络通信模块源码
    Mycat 用户手册:系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型.阻塞型I/O意味着控制权直到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的...
    99+
    2024-04-02
  • Hikari 数据库连接池内部源码实现的小细节
    目录Hikari 默认几个超时配置Hikari 连接池中默认连接数量为10Hikari通过CopyOnWriteArrayList保存所有的连接线程无法获取连接时通过Synchron...
    99+
    2023-02-17
    Hikari连接池 数据库连接池 Hikari连接池内部源码
  • Tomcat的数据源连接池怎么配置
    在Tomcat中配置数据源连接池需要在context.xml文件中进行配置。以下是配置步骤: 1、打开Tomcat安装目录下的con...
    99+
    2024-03-07
    Tomcat
  • redis连接池资源耗尽怎么解决
    当Redis连接池资源耗尽时,可以考虑以下几种解决方案: 调整连接池的配置:增加连接池的大小,以容纳更多的连接。可以通过修改配置...
    99+
    2024-05-11
    redis
  • 初识数据库连接池开源框架Druid
    Druid是阿里巴巴的一个数据库连接池开源框架,准确来说它不仅仅包括数据库连接池这么简单,它还提供强大的监控和扩展功能。本文仅仅是在不采用Spring框架对Druid的窥探,采用目前最新版本druid1.0...
    99+
    2024-04-02
  • Spring Boot 2.7.5 HikariCP 连接池多数据源配置
    一. 引言 当前项目遇到需要连接多个数据库的场景,此时需要引入多数据源了. 还有一些诸如以下的场景: 与第三方对接时,有些合作方并不会为了你的某些需求而给你开发一个功能,他们可以提供给你一个可以访...
    99+
    2023-08-31
    spring boot mybatis java
  • workerman写mysql连接池的实例代码
    首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用: 1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间 2、减少...
    99+
    2024-04-02
  • MySQL连接查询流程源码
    来源: 互联网 版本: 不详, 仅做参考用 初始化: 点击(此处)折叠或打开 ...
    99+
    2024-04-02
  • Spring实现HikariCP连接池的示例代码
    上两篇文章,我们讲到了Spring中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多选择,在SpringBoot 1.0中使用的是Tomcat的DataSource,在Sp...
    99+
    2024-04-02
  • Java使用MySQL实现连接池代码实例
    官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对连接池中的连接进行申请,使用,释放。 理解:创建数据库连接池是一个很耗时的操作,也...
    99+
    2022-05-20
    Java MySQL 连接
  • 从MySQL源码看其网络IO模型
    从MySQL源码看其网络IO模型 前言 MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是,便有了本篇博客。 MySQL启动So...
    99+
    2017-06-01
    从MySQL源码看其网络IO模型 数据库入门 数据库基础教程 数据库 mysql
  • Pytorch教程内置模型源码实现
    翻译自 https://pytorch.org/docs/stable/torchvision/models.html 主要讲解了torchvision.models的使用 torc...
    99+
    2024-04-02
  • Golang内存模型实例源码分析
    这篇文章主要介绍“Golang内存模型实例源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存模型实例源码分析”文章能帮助大家解决问题。1. 简介(Introduction)Go ...
    99+
    2023-07-05
  • tomcat/resin中怎么利用全局数据库连接池资源
    这期内容当中小编将会给大家带来有关tomcat/resin中怎么利用全局数据库连接池资源,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Tomcat使用JNDI Resou...
    99+
    2024-04-02
  • esp8266模块--MQTT协议连接服务器实现数据接收和发送+源码
    首先推荐中国移动的代码,我觉得中国移动的代码更为合理:(但是有一些其他的模块在里面) OneNET开发板代码、资料--2020-09-27--标准板、Mini板bug修复 - 开发板专区 - OneNET设备云论坛 (10086.cn) 以...
    99+
    2023-09-20
    笔记 嵌入式硬件 stm32
  • JDK 源码 阅读 - 2 - 设计模式 - 创建型模式
    A.创建型模式抽象工厂(Abstract Factory)javax.xml.parsers.DocumentBuilderFactory  DocumentBuilderFactory...
    99+
    2024-04-02
  • JDK 源码 阅读 - 3 - 设计模式 - 结构型模式
    1.适配器(Adapter)java.util.Arrays$ArrayList(java.util.Arrays#asList()); 这里要特别注意,这里的ArrayList是Arrays的内...
    99+
    2024-04-02
  • JDK 源码 阅读 - 4 - 设计模式 - 行为型模式
    1.职责链模式(Chain of responisibility)java.util.logging.Logger#log()javax.servlet.Filter#doFilter()2.命令模式(Co...
    99+
    2024-04-02
  • YOLOv5模型训练与评估源码分析
    本篇内容介绍了“YOLOv5模型训练与评估源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 搭建训练环境首先,我们需要搭建YOLOv...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作