mycat学习

news2025/10/20 15:33:51
安装部署

下载1:mycat2-install-template-1.21.zip

下载2:mycat2-1.21-release-jar-with-dependencies.jar

解压mycat2-install-template-1.21.zip

unzip mycat2-install-template-1.21.zip

把mycat2-1.21-release-jar-with-dependencies.jar放在mycat/lib中

修改mycat/conf/datasources/prototypeDs.datasource.json配置文件

{
    "dbType":"mysql",
    "idleTimeout":60000,
    "initSqls":[],
    "initSqlsGetConnection":true,
    "instanceType":"READ_WRITE",
    "maxCon":1000,
    "maxConnectTimeout":3000,
    "maxRetryCount":5,
    "minCon":1,
    "name":"prototypeDs",
    "password":"Q61@t6Udu8mW",
    "type":"JDBC",
    "url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
    "user":"mysteel",
    "weight":0
}

进入到mycat/bin目录,执行以下命令对文件分配权限

chmod 777 ./*

服务启动

./mycat start

客户端进行连接

默认的端口是8066,可以在mycat/conf/server.json中修改

默认的用户名密码是root/123456,可以在mycat/conf/user/root.user.json中修改

此时整体架构图为:

配置逻辑库

mycat默认有个集群,在mycat/conf/clusters/prototype.cluster.json中配置

{
    "clusterType":"MASTER_SLAVE",
    "heartbeat":{
        "heartbeatTimeout":1000,
        "maxRetry":3,
        "minSwitchTimeInterval":300,
        "slaveThreshold":0
    },
    "masters":[
        "prototypeDs"
    ],
    "maxCon":200,
    "name":"prototype",
    "readBalanceType":"BALANCE_ALL",
    "switchType":"SWITCH"
}

默认有两个逻辑库:information_schema,mysql,在mycat/conf/schemas下面配置

当我们在mycat中操作information_schema,mysql逻辑库下面的表时候实际在操作原型库中表

现在让我们来配置新的业务逻辑库(逻辑库的名称要和原型库的名称一致

在客户端执行:

/*+ mycat:createSchema{
    "customTables":{},
    "globalTables":{},
    "normalTables":{},
    "schemaName":"yc_nacos",
    "shardingTables":{},
    "targetName":"prototype"
} */;

会在mycat/conf/schemas目录下自动创建yc_nacos.schema.json文件,并且自动把逻辑库中的逻辑表和原型库中的真实表进行映射

多数据源整合

创建mysql数据源:

/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"yc-mysql",
"url":"jdbc:mysql://192.168.201.68:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"admin_user",
"password":"mOoBzUHGtqeX"
} */;

配置逻辑库:

/*+ mycat:createSchema{
    "customTables":{},
    "globalTables":{},
    "normalTables":{},
    "schemaName":"oem_mysteel",
    "shardingTables":{},
    "targetName":"yc-mysql"
} */;

oem_mysteel逻辑库下面的mysteel_data_3逻辑表对应的数据源是:192.168.202.150:3306

yc_nacos逻辑库下面的users逻辑表对应的数据源是:192.168.201.68:3306

不同数据源下面的表可以通过mycat进行联合查询

读写分离

在两个数据源(192.168.202.150:3306,192.168.201.68:3306)分别创建master_slave数据库,及在数据库下创建travelrecord表

CREATE database master_slave;
CREATE TABLE master_slave.`travelrecord` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` varchar(100) DEFAULT NULL,
  `traveldate` date DEFAULT NULL,
  `fee` decimal(10,0) DEFAULT NULL,
  `days` int DEFAULT NULL,
  `blob` longblob,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

创建集群:

/*! mycat:createCluster{"name":"prototype","masters":["prototypeDs"],"replicas":["yc-mysql"]} */;

创建逻辑表关联集群

/*+ mycat:createSchema{
    "customTables":{},
    "globalTables":{},
    "normalTables":{},
    "schemaName":"master_slave",
    "shardingTables":{},
    "targetName":"prototype"
} */;

查看集群状态:

/*+ mycat:showClusters{} */;

现在prototypeDs,yc-mysql两个数据源都可以读,我们改成只允许prototypeDs写,yc-mysql读,要修改两个地方

1、修改prototypeDs中的instanceType属性值为WRITE

{
    "dbType":"mysql",
    "idleTimeout":60000,
    "initSqls":[],
    "initSqlsGetConnection":true,
    "instanceType":"WRITE",
    "maxCon":1000,
    "maxConnectTimeout":3000,
    "maxRetryCount":5,
    "minCon":1,
    "name":"prototypeDs",
    "password":"Q61@t6Udu8mW",
    "type":"JDBC",
    "url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
    "user":"mysteel",
    "weight":0
}

2、修改集群中BALANCE_ALL改成BALANCE_ALL_READ

{
    "clusterType":"MASTER_SLAVE",
    "heartbeat":{
        "heartbeatTimeout":1000,
        "maxRetryCount":3,
        "minSwitchTimeInterval":300,
        "showLog":false,
        "slaveThreshold":0.0
    },
    "masters":[
        "prototypeDs"
    ],
    "maxCon":2000,
    "name":"prototype",
    "readBalanceType":"BALANCE_ALL",
    "replicas":[
        "yc-mysql"
    ],
    "switchType":"SWITCH"
}

readBalanceType:查询负载均衡策略

BALANCE_ALL(默认值):获取集群中所有数据源

BALANCE_ALL_READ:获取集群中允许读的数据源

BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先

BALANCE_NONE:获取集群中允许写数据源,即主节点中选择

switchType

NOT_SWITCH:不进行主从切换

SWITCH:进行主从切换

配置重启之后:

当前主库prototypeDs中master_slave下面的travelrecord数据为:

当前从库yc-mysql中master_slave下面的travelrecord数据为:

现在在mycat客户端插入user_id为1000的数据:

insert into travelrecord(user_id)values ("1000");

此时主库prototypeDs中master_slave下面的travelrecord数据为:

此时从库yc-mysql中master_slave下面的travelrecord数据为:

现在在mycat客户端查询master_slave下面的travelrecord表数据为:

达到了在master_slave(prototypeDs)主库写,master_slave(yc-mysql)从库读的效果

配置prototypeDs,yc-mysql主从同步

可以查看https://yangcai.blog.csdn.net/article/details/122124151这个帖子

此时架构图为:

分库分表

创建数据源,因为我只准备了两个mysql库

/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"m1",
"url":"jdbc:mysql://192.168.201.68:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"admin_user",
"password":"mOoBzUHGtqeX"
} */;
/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"m2",
"url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"mysteel",
"password":"Q61@t6Udu8mW"
} */;

在mycat/conf/datasources下面会创建m1.datasource.json m2.datasource.json两个文件

创建两个集群:

/*! mycat:createCluster{"name":"c0","masters":["m1"],"replicas":[]} */;
/*! mycat:createCluster{"name":"c1","masters":["m2"],"replicas":[]} */;

在mycat/conf/clusters下面会创建c0.cluster.json c1.cluster.json两个文件

注意:mycat分库分表默认选择的集群名称的规则是c${targetIndex},targetIndex是从0开始计算的

在mycat客户端创建分库分表逻辑库:

create database   sub_base_table;

在mycat/conf/schemas下面会创建sub_base_table.schema.json

在逻辑库下面创建分片表:

CREATE TABLE sub_base_table.`travelrecord` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` varchar(100) DEFAULT NULL,
  `traveldate` date DEFAULT NULL,
  `fee` decimal(10,0) DEFAULT NULL,
  `days` int DEFAULT NULL,
  `blob` longblob,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
)  ENGINE = INNODB DEFAULT CHARSET = utf8 dbpartition BY mod_hash ( user_id ) tbpartition BY mod_hash(id)tbpartitions 2 dbpartitions 2 ;

在sub_base_table.schema.json中的内容为:

{
    "customTables":{},
    "globalTables":{},
    "normalProcedures":{},
    "normalTables":{},
    "schemaName":"sub_base_table",
    "shardingTables":{
        "travelrecord":{
            "createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2",
            "function":{
                "properties":{
                    "dbNum":"2",
                    "mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}",
                    "tableNum":"2",
                    "tableMethod":"mod_hash(id)",
                    "storeNum":2,
                    "dbMethod":"mod_hash(user_id)"
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}

此时m1,m2数据源就会创建分库分表,规则就是sub_base_table_${dbIndex}/travelrecord_${tableIndex},sub_base_table和targetIndex是从0开始计算的

此时架构图为:

全局表

如果项目中有一些数据类似字典常量等字段,这种数据一般数据量不会很大,而且改动也比较少,通常这种表可以不需要进行拆分,把它当做全局表进行处理,每个分片都创建一张相同的表,在所有的分片上都保存一份数据。在进行插入、更新、删除操作时,会将sql语句发送到所有分片上进行执行,在进行查询时,也会把sql发送到各个节点。这样避免了跨库JOIN操作,直接与本分片上的全局表进行聚合操作。

特性:

全局表的插入、更新、删除等操作会实时在所有节点上执行,保持各个分片的数据一致性;

全局表的查询操作,随机从一个节点上进行;

全局表可以跟任何一个表进行 JOIN 操作

在mycat客户端sub_base_table逻辑库执行:

CREATE TABLE sub_base_table.`user_config` (
`user_id` varchar(100)  NOT NULL ,
`user_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;

此时sub_base_table.schema.json中的内容为:

{
    "customTables":{},
    "globalTables":{
        "user_config":{
            "broadcast":[
                {
                    "targetName":"c0"
                },
                {
                    "targetName":"c1"
                }
            ],
            "createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"
        }
    },
    "normalProcedures":{},
    "normalTables":{},
    "schemaName":"sub_base_table",
    "shardingTables":{
        "travelrecord":{
            "createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2",
            "function":{
                "properties":{
                    "dbNum":"2",
                    "mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}",
                    "tableNum":"2",
                    "tableMethod":"mod_hash(id)",
                    "storeNum":2,
                    "dbMethod":"mod_hash(user_id)"
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}

则在m1,m2中的sub_base_table物理库中都会创建user_config表

普通表

就是常规表

CREATE TABLE sub_base_table.`user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

此时sub_base_table.schema.json中的内容为:

{
    "customTables":{},
    "globalTables":{
        "user_config":{
            "broadcast":[
                {
                    "targetName":"c0"
                },
                {
                    "targetName":"c1"
                }
            ],
            "createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"
        }
    },
    "normalProcedures":{},
    "normalTables":{
        "user":{
            "createTableSQL":"CREATE TABLE sub_base_table.`user` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8",
            "locality":{
                "schemaName":"sub_base_table",
                "tableName":"user",
                "targetName":"prototype"
            }
        }
    },
    "schemaName":"sub_base_table",
    "shardingTables":{
        "travelrecord":{
            "createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2",
            "function":{
                "properties":{
                    "dbNum":"2",
                    "mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}",
                    "tableNum":"2",
                    "tableMethod":"mod_hash(id)",
                    "storeNum":2,
                    "dbMethod":"mod_hash(user_id)"
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}

普通表默认指向的集群是prototype,在prototypeDs-sub_base_table中会创建user表

ER表

基于E-R关系进行分片,子表的记录与其关联的父表的记录保存在同一个分片上,这样关联查询就不需要跨库进行查询,要注意的是无需指定ER表,是自动识别的,两表的分片算法一致就可以了

如:travel是travelrecord的附属表

CREATE TABLE sub_base_table.`travel` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `u_id` varchar(100) DEFAULT NULL,
  `travel` date DEFAULT NULL,
   PRIMARY KEY (`id`)
)  ENGINE = INNODB DEFAULT CHARSET = utf8 dbpartition BY mod_hash(u_id) tbpartition BY mod_hash(id) tbpartitions 2 dbpartitions 2 ;

此时sub_base_table.schema.json中的内容为:

{
    "customTables":{},
    "globalTables":{
        "user_config":{
            "broadcast":[
                {
                    "targetName":"c0"
                },
                {
                    "targetName":"c1"
                }
            ],
            "createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"
        }
    },
    "normalProcedures":{},
    "normalTables":{
        "user":{
            "createTableSQL":"CREATE TABLE sub_base_table.`user` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8",
            "locality":{
                "schemaName":"sub_base_table",
                "tableName":"user",
                "targetName":"prototype"
            }
        }
    },
    "schemaName":"sub_base_table",
    "shardingTables":{
        "travelrecord":{
            "createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2",
            "function":{
                "properties":{
                    "dbNum":"2",
                    "mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}",
                    "tableNum":"2",
                    "tableMethod":"mod_hash(id)",
                    "storeNum":2,
                    "dbMethod":"mod_hash(user_id)"
                },
                "ranges":{}
            },
            "partition":{
                
            },
            "shardingIndexTables":{}
        },
        "travel":{
            "createTableSQL":"CREATE TABLE sub_base_table.`travel` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`u_id` varchar(100) DEFAULT NULL,\n\t`travel` date DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(u_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2",
            "function":{
                "properties":{
                    "dbNum":"2",
                    "mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travel_${tableIndex}",
                    "tableNum":"2",
                    "tableMethod":"mod_hash(id)",
                    "storeNum":2,
                    "dbMethod":"mod_hash(u_id)"
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}

当执行以下sql的时候的就避免了跨库join,跨库join查询的性能非常慢

select * from sub_base_table.`travel`  a  INNER JOIN  sub_base_table.`travelrecord` b on a.u_id = b.user_id 

查看配置的表是否具有ER关系,使用

/*+ mycat:showErGroup{}*/

group_id表示相同的组,该组中的表具有相同的存储分布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【逐步剖C】-第五章-指针初阶

一、指针的基本知识 1. 预备知识: (1)内存的简单概念: 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行。 为了有效的使用内存,就把内存划分成一个个小的内存单元,经过仔细…

js方法总结:join 、split、splice、async await

async await 异步里面有同步操作 执行完一个,再去执行另一个是同步,如promise().then() 所有的一起执行是异步 同步和异步操作的区别就是是否阻碍后续代码的执行。 下面例子是同步,执行完 test再去执行test2最后test3,&#xff…

Android 性能优化之内存优化与泄漏分析工具LeakCanary

一、背景 在Android应用中,除了正常的业务开发,我们也要关注性能问题。卡顿、内存溢出、内存泄漏等问题,直接的表现会反馈到用户体验上,用户体验不好导致应用被卸载或者换到其他平台。 在性能优化,各大公司都会付出一些…

sass预处理中文教程(2023开学版)

Sass安装步骤 一、Sass的安装 由于Sass是使用Ruby编写的,所以我们在使用Sass之前需要安装一下Ruby。下面是Windows平台的安装步骤。对于Mac平台,请查看这里:Mac平台安装Sass。 【步骤1“下载Ruby”】:大家到Ruby的官网&#xf…

MySQL----内置函数

MySQL---->内置函数 函数:将经常使用的代码封装起来,需要的时候直接调用就可以 从函数定义角度,函数可分为: 内置函数:系统内置的通用函数自定义函数:需要根据需求编写的函数 MySQL提供的内置函数从…

【游戏逆向】RPG游戏自动打怪之取得最近怪物

RPG游戏辅助想要自动打怪,首要的任务就是需要获得最近的怪物,否则打怪的顺序会非常混乱。 想要取得最近怪物信息 要2个步骤 第一步 计算出所有怪物的距离 第二步 对所有怪物的距离进行判断,筛选出距离最近的 第一步怪物距离计算 如果是以2D的平面来看 2个点的距…

[Tomcat下载安装以及配置(详细教程)]

下载及安装Tomcat进入tomcat官网,Tomcat官网Apache Tomcat - Welcome!选择需要下载的版本,点击下载下载路径一定要记住,并且路径中尽量不要有中文下载后是压缩包 .zip,解压后tomcat系统各个文件夹目录是什么意义:bin&a…

二进制部署K8S集群

目录 一、架构图 二、部署步骤 1、实验环境 2、操作系统初始化配置 3、部署 docker引擎 4、部署 etcd 集群 5、部署 Master 组件 一、架构图 二、部署步骤 1、实验环境 服务器类型IP地址master192.168.80.5node01192.168.80.8node02192.168.80.9 2、操作系统初始化配置…

【C++】类和对象--类的6个默认成员函数

目录1.类的6个默认成员函数2.构造函数2.1概念2.2特性3.析构函数3.1概念3.2特性4.拷贝构造函数4.1概念4.2特征5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载5.4流插入和流提取运算符重载6.const成员7.取地址重载和const取地址操作符重载1.类的6个默认成员函…

“搜索大战”正式打响,微软发布ChatGPT版搜索引擎和浏览器

微软公司宣布推出由ChatGPT支持的最新版本Bing(必应)搜索引擎和Edge浏览器,今天上线,免费使用! 自去年开始,Stable Diffusion、ChatGPT 等 AI 工具的横空出世,貌似在告诉人们“AI 正在准备重塑整…

常见的编程语言有哪些?

一、编程语言定义 编程语言的定义是指主要用于人和计算机之间通信的语言,它既能够让程序员能够准确的定义计算机所需数据,也能让计算机精准的识别人的意图。 二、编程语言排行榜以上排名信息来源于Tiobe公司公布的编程语言排行榜,近两年由于大…

【学习笔记】Nginx学习

Nginx是高性能的HTTP和反向代理的web服务器,占用内存小,处理高并发连接强,处理静态文件好耗费内存少但是不支持Java语言,Java程序只能通过与Tomcat配合完成正向代理客户端无法直接访问目标服务器,而是通过向代理服务器…

微信小程序 Springboot英语在线学习助手系统 uniapp

四六级助手系统用户端是基于微信小程序端,管理员端是基于web端,本系统是基于java编程语言,mysql数据库,idea开发工具, 系统分为用户和管理员两个角色,其中用户可以注册登陆小程序,查看英语四六级…

Java后端项目IDEA配置代码规范检查,使用checkStyle实现

最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案: 1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很…

Revit过滤器怎么用?过滤可见性操作方法

一、Revit中关于项目传递“可见性中设置的过滤器规则”的方法 设计院结构专业给机电专业提资,为了对于净高有一个直观快捷的表达,结构专业工程师就可以利用Revit可见性(快捷键:VV)中的过滤器来给本专业的梁、板相对标高用颜色进行区分&#x…

python爬虫工程师 | 都会遇到的反爬手段,详细展示低难度反爬

在爬虫实战过程中,常见的反爬手段如下所示。 IP 地址限制:网站可以检测爬虫的 IP 地址,并限制爬虫访问。User-Agent 限制:网站可以通过检测请求头中的 User-Agent 来识别爬虫。Referrer 限制:网站可以通过检测请求头中…

TCO-PNB ester,1438415-89-4 ,反式环辛烯对硝基苯酯,可用于标记蛋白质

TCO-PNB ester,TCO-PNB,反式环辛烯-对硝基苯酯 ,反式环辛烯对硝基苯酯,TCO-PNB酯产品结构式:产品规格:1.CAS号:1438415-89-4 2.分子式:C15H17NO53.分子量:291.34.包装规格…

[python入门㊶] - python写入文件

目录 ❤ 写入空文件(覆盖) ❤ 写入多行 ❤ 在原有文件上添加内容 保存数据的最简单的方式之一是将其写入到文件中❤ 写入空文件(覆盖) # codingUTF-8 filename test_text.txt with open(filename, w) as file_object:file_o…

怎么做室内导航?室内导航图用什么做的?

目前大多数的图资系统提供的室内地图多为静态信息,并没有随时间空间改变而更新的能力,在现有技术中缺乏一种展示室内真实场景的室内地图生成方法。由于室内的环境空间信息会因为时空迁变而有所不同,因此,如何以更快速且低成本的方…

Python深度学习实战PyQt5布局管理项目示例详解

本文具体介绍基本的水平布局、垂直布局、栅格布局、表格布局和进阶的嵌套布局和容器布局,最后通过案例带小白创建一个有型的图形布局窗口布局管理就是管理图形窗口中各个部件的位置和排列。图形窗口中的大量部件也需要通过布局管理,对部件进行整理分组、…