MySQL读写分离中间件
1.什么是读写分离中间件?
就是实现当[写]的时候转发到主库,当[读]的时候转发到从库的工具。
很类似学习过的proxy,比如nginx proxy做动静分离.
2.为什么要实现读写分离?
1)让主库专注于写,因为读可以有很多从库可以干。
2)让多个从库接收并发读请求。
好处,增加读和写的并发,防止锁竞争,减轻主数据库的压力。
生产场景:读写比基本都比较大,超过10/1.
3.读写分离中间件有哪些?
1)程序实现(JAVA,PHP,PYTHON,SHELL)
需要读写分离的SQL语句DML语句关键字:insert,delete,update,select
读:select开头找从库,否则就找主库。
优点:少配置一个服务,降低了连接延迟以及服务宕机问题。
程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。
2)中间件插件(对应用层透明,ip1 读,ip2写)
amoeba: 直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案,自己分配账户,和后端数据库权限管理独立,权限处理不够灵活。
mysql-proxy:
直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,效率低
proxySQL
Atlas
maxscale
cobar
mycat
====================
proxySQL(推荐使用)类似学习过的proxy NGINX(nginx 反向代理,代理web服务请求)
4. ProxySQL介绍
ProxySQL是一个高性能的MySQL代理软件,可以实现数据库读写分离,支持 Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载配置信息(无需重启ProxySQL ),支持故障切换和SQL过滤功能。
Scale 100K+ connections
across thousands of servers
ProxySQL网站:
https://www.proxysql.com/
https://github.com/sysown/proxysql/wiki
5. 基本架构逻辑原理
见架构图。
6.检查修改主从复制环境
GTID环境:
51:Master mha node/mha management
52/53:Slave mha node
7. 安装ProxySQL插件
# 下载proxySQL
https://proxysql.com/
https://github.com/sysown/proxysql/releases
Scale 100K+ connections
across thousands of servers
# 安装proxySQL
# 理论选择哪个机器都可以,本次选择51安装。
[root@db03 ~]# rpm -ivh proxysql-2.0.10-1-centos7.x86_64.rpm
[root@db03 bin]# systemctl start proxysql
[root@db03 bin]# netstat -tulnp|grep 603
tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN 15595/proxysql
tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 15595/proxysql
注意:
#6033 对外提供服务端口,用户连接
#6032 管理员管理端口
# 登录proxySQL
[root@db03 bin]# mysql -uadmin -padmin -h127.0.0.1 -P6032
db03 [(none)]>show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
db03 [(none)]>use main
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
db03 [main]>show tables;
+----------------------------------------------------+
| tables |
+----------------------------------------------------+
| mysql_group_replication_hostgroups |
| mysql_query_rules |
| mysql_replication_hostgroups |
| mysql_servers |
| mysql_users |
| runtime_*
+----------------------------------------------------+
8. ProxySQL中管理结构自带系统库
在ProxySQL中,6032端口管理共五个库: main、disk、stats 、monitor、stats_history
核心是main库:
main:
main 库中有如下信息:
1)mysql_replication_hostgroups : 读写节点分组配置信息
db03 [main]>select * from mysql_replication_hostgroups;
+------------------+------------------+------------+---------+
| writer_hostgroup | reader_hostgroup | check_type | comment |
+------------------+------------------+------------+---------+
| 10 | 20 | read_only | proxy |
+------------------+------------------+------------+---------+
2)mysql_servers: 后端可以连接MySQL服务器的列表 ###nginx upstream池子
db03 [main]>select * from mysql_servers;
+--------------+-----------+------+-----------+--------+--------+----------------+
| hostgroup_id | hostname | port | gtid_port | status | weight |max_connections |
+--------------+-----------+------+-----------+--------+--------+----------------+
| 20 | 10.0.0.52 | 3306 | 0 | ONLINE | 1 |1000 |
| 10 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 |1000 |
| 20 | 10.0.0.53 | 3306 | 0 | ONLINE | 1 |1000 |
| 20 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 |1000 |
+--------------+-----------+------+-----------+--------+--------+----------------+
3)mysql_users: 配置后端数据库的账号和监控的账号。
db03 [main]>select username,password,default_hostgroup from mysql_users;
+----------+----------+-------------------+
| username | password | default_hostgroup |
+----------+----------+-------------------+
| root | 123 | 10 |
+----------+----------+-------------------+
4)mysql_query_rules: 指定Query路由到后端不同服务器的规则列表。
db03 [main]>select rule_id,active,match_pattern,destination_hostgroup from mysql_query_rules;
+---------+--------+----------------------+-----------------------+
| rule_id | active | match_pattern | destination_hostgroup |
+---------+--------+----------------------+-----------------------+
| 1 | 1 | ^select.*for update$ | 10 |
| 2 | 1 | ^select | 20 |
+---------+--------+----------------------+-----------------------+
注: 表名以 runtime_开头的表示ProxySQL当前运行的配置内容,不能直接修改。
不带runtime_是下文图中Mem相关的配置。
disk :
持久化的磁盘的配置
stats:
统计信息的汇总
monitor:
监控的收集信息,比如数据库的健康状态等
stats_history:
ProxySQL收集的有关其内部功能的历史指标
9. ProxySQL管理接口的多层配置关系
见架构图。
整套配置系统分为三层:
顶层 RUNTIME
中间层 MEMORY(主要修改的配置表)
持久层 DISK和CFG FILE
RUNTIME :
代表ProxySQL当前正在使用的配置,无法直接修改此配置,必须要从下一层(MEM层)load进来。
MEMORY:
MEMORY层上面连接RUNTIME层,下面连接disk持久层。这层可以在线操作ProxySQL 配置,随便修改,不会影响生产环境。确认正常之后在加载到RUNTIME和持久化磁盘上。
修改方法: 使用SQL DML语句:insert、update、delete、select。
DISK和CONFIG FILE:
持久化配置信息。重启时,可以从磁盘快速加载回来。
10. 在不同层次间移动配置
为了将配置持久化到磁盘或者应用到 runtime,在管理接口下有一系列管理命令来实现它们。
1. user相关配置
## MEM加载到runtime
LOAD MYSQL USERS TO RUNTIME;
## runtime保存至MEM
SAVE MYSQL USERS TO MEMORY;
## disk加载到MEM
LOAD MYSQL USERS FROM DISK;
## MEM到disk
SAVE MYSQL USERS TO DISK;
## CFG到MEM
LOAD MYSQL USERS FROM CONFIG
=============================
2. server相关配置
## MEM加载到runtime
LOAD MYSQL SERVERS TO RUNTIME;
## runtime保存至MEM
SAVE MYSQL SERVERS TO MEMORY;
## disk加载到 MEM
LOAD MYSQL SERVERS FROM DISK;
## MEM 到disk
SAVE MYSQL SERVERS TO DISK;
## CFG 到 MEM
LOAD MYSQL SERVERS FROM CONFIG
===============================
3. mysql query rules配置
## MEM 加载到runtime
LOAD MYSQL QUERY RULES TO RUNTIME;
## runtime 保存至 MEM
SAVE MYSQL QUERY RULES TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL QUERY RULES FROM DISK;
## MEM 到 disk
SAVE MYSQL QUERY RULES TO DISK;
## CFG 到 MEM
LOAD MYSQL QUERY RULES FROM CONFIG
=================================
4. MySQL variables配置
## MEM 加载到runtime
LOAD MYSQL VARIABLES TO RUNTIME;
## runtime 保存至 MEM
SAVE MYSQL VARIABLES TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL VARIABLES FROM DISK;
## MEM 到 disk
SAVE MYSQL VARIABLES TO DISK;
## CFG 到 MEM
LOAD MYSQL VARIABLES FROM CONFIG
总结:
日常配置其实大部分时间在MEM层配置,
然后load到RUNTIME,然后SAVE到Disk。cfg很少使用。
常见命令:
使用SQL DML语句修改:insert、update、delete、select。
使用LOAD,SAVE生效和保存。
load xxx to runtime;
save xxx to disk;
XXX就是上面配置里关键字部分
注意:
所有配置保MEM或disk层时,都不会发生任何警告或错误。
只有load到runtime状态时才会验证配置。当load到 runtime时,如果出现错误,将恢复为之前保存的状态,这时可以去检查错误日志。
11. ProxySQL应用————基于SQL实现读写分离
11.1 MySQL从库要设定read_only参数
1)主从复制的从库应该禁止用户写入。
2)ProxySQL如何判断主从(根据是否有read-only=1)
read-only=1就是从,否则就是主。
将52,53设置为read-only=1,修改配置步骤略.
11.2 配置读写节点分组信息
在mysql_replication_hostgroup表中,配置读写组编号
10编号对应就是写库的组,20编号对应的就是读库的组。
[root@db01 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
db03 [(none)]>use main
insert into mysql_replication_hostgroups(writer_hostgroup, reader_hostgroup, comment)
values (10,20,'proxy');
db01 [main]>select * from mysql_replication_hostgroups;
+------------------+------------------+------------+---------+
| writer_hostgroup | reader_hostgroup | check_type | comment |
+------------------+------------------+------------+---------+
| 10 | 20 | read_only | proxy |
+------------------+------------------+------------+---------+
db01 [main]>load mysql servers to runtime;
db01 [main]>save mysql servers to disk;
db01 [main]>select * from mysql_replication_hostgroups\G
*************************** 1. row ***************************
writer_hostgroup: 10
reader_hostgroup: 20
check_type: read_only
comment: proxy
说明:
ProxySQL会根据server的read_only的取值将服务器进行分组。
read_only=0的server,master被分到编号为10的写组,
read_only=1的server,slave则被分到编号20的读组。
所以需要将从库设置:set global read_only=1;
11.3. 添加主机到ProxySQL
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.51',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.52',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.53',3306);
db01 [main]>select * from mysql_servers;
+--------------+-----------+------+-----------+--------+--------+-----------------+
| hostgroup_id | hostname | port | gtid_port | status | weight | max_connections |
+--------------+-----------+------+-----------+--------+--------+-----------------+
| 10 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 | 1000 |
| 20 | 10.0.0.52 | 3306 | 0 | ONLINE | 1 | 1000 |
| 20 | 10.0.0.53 | 3306 | 0 | ONLINE | 1 | 1000 |
+--------------+-----------+------+-----------+--------+--------+-----------------+
load mysql servers to runtime;
save mysql servers to disk;
11.4. 创建监控用户,并开启监控
1)# 51主库创建监控用户,给ProxySQL连接。
create user monitor@'%' identified with mysql_native_password by '123';
grant replication client on *.* to monitor@'%';
# proxySQL库修改variables表,让proxySQL可以通过monitor用户和123密码去连接和监控数据库
set mysql-monitor_username='monitor';
set mysql-monitor_password='123';
或者 :
UPDATE global_variables SET variable_value='monitor'
WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='123'
WHERE variable_name='mysql-monitor_password';
load mysql variables to runtime;
save mysql variables to disk;
2)# 查询监控日志
db01 [(none)]>select * from mysql_server_connect_log;
db01 [(none)]>select * from mysql_server_ping_log;
db01 [(none)]>select * from mysql_server_read_only_log;
db01 [(none)]>select * from mysql_server_replication_lag_log;
3)配置web节点等应用连接ProxySQL的用户
设定应用连接ProxySQL的用户为root,密码为123
# proxysql代理
insert into mysql_users(username,password,default_hostgroup) values('root','123',10);
load mysql users to runtime;
save mysql users to disk;
# 51主库创建允许proxysql代理访问的用户和密码
create user root@'%' identified with mysql_native_password by '123';
grant all on *.* to root@'%';
注意;早期版本,需要开启事务持续化。今天版本不需要,只是提及。
update mysql_users set transaction_persistent=1 where username='root';
load mysql users to runtime;
save mysql users to disk;
让事务里的所有SQL都读写同一个库:
begin;
select
update
insert
delete
commit;
4) 读写规则流程或原理
架构图
5)配置读写规则mysql_query_rules
# ProxySQL
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
注: select … for update规则的rule_id必须要小于普通的select规则的rule_id,
ProxySQL是根据rule_id的顺序进行规则匹配。
6. 模拟web测试读写分离
成功:
[root@db01 /usr/local/bin]# mysql -uroot -p123 -P6033 -h 127.0.0.1 -e "select @@server_id;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 51 |
+-------------+
[root@db01 /usr/local/bin]# mysql -uroot -p123 -P6033 -h 127.0.0.1 -e "select @@server_id;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 52 |
+-------------+
[root@db01 /usr/local/bin]# mysql -uroot -p123 -P6033 -h 127.0.0.1 -e "select @@server_id;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 53 |
+-------------+
[root@db01 ~]# mysql -uroot -p123 -P6033 -h 127.0.0.1 -e "begin;select @@server_id;commit;"
遇到问题:上面语句可以访问到51,52,53,原因:
db01 [main]>select * from mysql_servers;
+--------------+-----------+------+-----------+--------+-------------------------+
| hostgroup_id | hostname | port | gtid_port | status | weight max_connections |
+--------------+-----------+------+-----------+--------+-------------------------+
| 10 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 1000 |
| 20 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 1000 |
| 20 | 10.0.0.53 | 3306 | 0 | ONLINE | 1 1000 |
| 10 | 10.0.0.52 | 3306 | 0 | ONLINE | 1 1000 |
| 10 | 10.0.0.53 | 3306 | 0 | ONLINE | 1 1000 |
| 20 | 10.0.0.52 | 3306 | 0 | ONLINE | 1 1000 |
+--------------+-----------+------+-----------+--------+-------------------------+
从上面那内容可以发现,所有节点都在写组10里,所有节点都在读组20里。
最终罪魁祸首,没有在从库配置read_only=1;临时设置如下;
52/53上配置;
set global read_only=1; ##普通用户只读。
set global super_read_only=1; ##管理员用户只读。
返回:proxysql查看,立刻发生吧变化
db01 [main]>select * from mysql_servers;
+--------------+-----------+------+-----------+--------+--------+---------+
| hostgroup_id | hostname | port | gtid_port | status | weight | comment |
+--------------+-----------+------+-----------+--------+--------+---------+
| 10 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 | |
| 20 | 10.0.0.51 | 3306 | 0 | ONLINE | 1 | |
| 20 | 10.0.0.53 | 3306 | 0 | ONLINE | 1 | |
| 20 | 10.0.0.52 | 3306 | 0 | ONLINE | 1 | |
+--------------+-----------+------+-----------+--------+--------+---------+
10是写组有51,20是读组,有51,52,53.
[root@db01 ~]# mysql -uroot -p123 -P 6033 -h 127.0.0.1 -e "select @@server_id;"
db01 [(none)]>select * from stats_mysql_query_digest\G
给开发人员:
root 123
6033
10.0.0.51
自动实现读写分离,根据语句过滤select读,其他写.
8. ProxySQL应用扩展——花式路由规则
1. 基于端口实现读写分离
## 修改ProxySQL监听SQL流量的端口号,监听多端口上。
set mysql-interfaces='0.0.0.0:6033;0.0.0.0:6034';
save mysql variables to disk;
## 重启生效
systemctl restart proxysql
## 设定路由规则
delete from mysql_query_rules; # 为了测试,先清空已有规则
insert into mysql_query_rules(rule_id,active,proxy_port,destination_hostgroup,apply)
values(1,1,6033,10,1), (2,1,6034,20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
说明: 除了基于端口进行分离,还可以基于监听地址(修改字段proxy_addr即可),也可以基于客户端地址(修改字段client_addr字段即可)。
给开发人员:
写:
root
123
6033
10.0.0.51
读
root
123
6034
10.0.0.51
2. 基于用户实现读写分离
insert into mysql_users(username,password,default_hostgroup)
values('writer','123',10),('reader','123',20);
load mysql users to runtime;
save mysql users to disk;
delete from mysql_query_rules; # 为了测试,先清空已有规则
insert into mysql_query_rules(rule_id,active,username,destination_hostgroup,apply)
values(1,1,'writer',10,1),(2,1,'reader',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
#最后在主库创建writer,reader用户和密码。
作业:实践基于端口和基于用户实现读写分离。
给开发人员:
写:
writer
123
6033
10.0.0.51
读:
reader
123
6033
10.0.0.51
相关文章:
MySQL读写分离中间件
1.什么是读写分离中间件? 就是实现当[写]的时候转发到主库,当[读]的时候转发到从库的工具。 很类似学习过的proxy,比如nginx proxy做动静分离. 2.为什么要实现读写分离? 1)让主库专注于写,因为读可以有很多从库可以干…...

【Spring源码设计模式】单例模式外带设计模式的单例模式
Bean的概念 是Spring框架在运行时管理的对象,是任何引用程序的基本构建块。 Bean的属性 id属性:Bean的唯一标志名,必须以字母开头且不包含特殊字符 class属性:用来定义类的全限定名(包名 类名) name属性…...

go并发编程 —— singleflight设计模式
什么是singleflight singleflight是一种并发编程设计模式,将同一时刻的多个并发请求合并成一个请求,以减少对下游服务的压力 为什么叫singleflight fly可以理解为请求数,singleflight就是单个请求 使用场景 该模式主要用于防止缓存击穿 …...

【LeetCode】二叉树的中序遍历(递归,迭代,Morris遍历)
目录 题目要求:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 方法一:递归 方法二:迭代 思路分析: 复杂度分析 代码展示: 方法三:Morris 遍历 思路分析: 复杂度分析…...

银行数字化转型导师坚鹏:数字化转型背景下的银行柜员提升之道
数字化转型背景下的银行柜员提升之道 课程背景: 很多银行都在开展银行数字化运营工作,目前存在以下问题急需解决: l 不清楚银行数字化运营包括哪些关键工作? l 不清楚银行数字化运营工作的核心方法论? l 不清楚银行数字…...

ChatGPT的平替来了?一文总结 ChatGPT 的开源平替,你值得拥有
文章目录【AIGC精选】总结 ChatGPT 的开源平替,你值得拥有1.斯坦福发布 Alpaca 7B,性能匹敌 GPT-3.52.弥补斯坦福 Alpaca 中文短板,中文大模型 BELLE 开源3.国产AI大模型 ChatGLM-6B 开启内测4.中文 Alpaca 模型 Luotuo 开源5. ChatGPT 最强竞…...

关于数据同步工具DataX部署
1.DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址:GitHub - alibaba/DataX: DataX是…...
如何开发JetBrains插件
1 标题安装 IntelliJ IDEA 如果您还没有安装 IntelliJ IDEA,从官方网站下载并安装 IntelliJ IDEA Community Edition(免费)或 Ultimate Edition(付费)。 2 创建插件项目 在 IntelliJ IDEA 中,创建一个新…...

企业采购成本管理的难题及解决方案
企业采购成本控制是企业管理中的一个重要方面,也是一个不容易解决的难题。企业采购成本控制面临的难题包括以下几个方面: 1、采购流程复杂 企业采购通常需要经过一系列的流程,包括采购计划、采购申请、报价、比价、议标、合同签订、验收、付…...
龙蜥白皮书精选:基于 SM4 算法的文件加密(fscrypt)实践
文/张天佳 通常我们会以文件作为数据载体,使用磁盘,USB 闪存,SD 卡等存储介质进行数据存储,即便数据已经离线存储,仍然不能保证该存储介质不会丢失,如果丢失那么对于我们来说有可能是灾难性的事件。因此对…...

【SpringBoot入门】SpringBoot的配置
SpringBoot的配置文件一、SpringBoot配置文件分类二、yaml 概述三、多环境配置四、Value 和 ConfigurationProperties五、总结一、SpringBoot配置文件分类 SpringBoot 是基于约定的,很多配置都是默认的(主方法上SpringBootApplication注解的子注解Enabl…...
react 学习整理
如何使用引号传递字符串 常见的 <imgclassName avatersrc http://...alt gregorio y />或者声明变量来保存 export default function XXX(){ const avator avator const description gergorio y return (<image className XXXsrc {avator}alt {alt} />)…...
物理引擎系统-ode
物理引擎系统-ode 目录 物理引擎系统-ode 一、物理引擎系统-ode——processIslands 二、物理引擎系统-ode——processIslands 三、物理引擎系统-ode——processIslands 四、物理引擎系统-ode——processIslands 五、物理引擎系统-ode——processIslands 一、物理引…...
函数设计—参数规则
【规则1-1】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。 如果函数没有参数,则用 void 填充。 例如: void SetValue(int width, int height); // 良好的风格 void SetValue(int, int); // 不良的风格 float GetValue(…...

rsync远程同步
目录 rsync rsync简介 rsync优点 同步方式 rsync名词解释 rsync工作原理 常用rsync命令 配置源的两种表达方法 远程同步实操 如何不想每次登录的时候输入密码 同步删除文件 定时完成操作 格式二 指定资源下载到/opt进行备份 通过信道协议同步数据编辑编辑 rs…...
中国大陆IP段(仅大陆地区)【2020-07-24】
中国大陆IP段(仅大陆地区)【2020-07-24】 1.1.8.0/24 1.2.4.0/24 1.8.1.0/24 1.8.8.0/24 1.18.128.0/24 1.24.0.0/13 1.45.0.0/16 1.48.0.0/14 1.56.0.0/13 1.68.0.0/14 1.80.0.0/13 1.88.0.0/14 1.92.0.0/20 1.93.0.0/16 1.94.0.0/15 1.119.0.0/17 1.11…...

从零开始的嵌入式Linux生活(一) 背景介绍
文章目录前言本系列文章的主要思想:本系列文章包括:一、什么是嵌入式开发二.嵌入式开发 - 由便宜到贵三.嵌入式开发的基本原理一个美好的假设:再来一个美好的假设美好的假设被打破了 - RTOS系统美好的假设又被打破了 - 嵌入式Linux系统老板飘…...

后缀为whl的文件是什么?如何安装whl文件?学习一下(22)
小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 了解并使用Pyhton的库安装包文件whl。 什么是whl文件 whl格式本质上是一个压缩包,里面包含了py文件&am…...
整合Juit
整合Juit 1.SpringBoot整合Juit SpringBootTest class Springboot04JuitApplicationTests {AutowiredBookDao bookDao;Testvoid contextLoads() {System.out.println("test................");bookDao.save();} } 名称:SpringBootTest 类型&…...

C#,码海拾贝(11)——拉格朗日(Lagrange)三点式曲面插值算法,《C#数值计算算法编程》源代码升级改进版
本文开始是曲面插值(Surface Interpolation,也称作:二维插值,二元插值)。 数值计算三点式 数值计算三点式是一种常见的数值计算方法,它是通过对已知函数在某个点及其左右两个点处的函数值进行数值插值&…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...