数据服务总线的搭建

news2024/11/26 3:54:57

关于http协议的基础知识就不介绍了。主要介绍它的报文格式。
如何显示http的报文;
浏览器登录服务端的IP和端口:
服务端接收http客户端发过来的报文:recv(connfd,buffer,1000,0),打印出来。

请求报文格式是请求行,请求头部,请求内容。

在这里插入图片描述

使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind

也可以利用客户端程序向服务端(比如某个网站)发送请求,网站服务端会回复,响应报文的头部,后面的数据就是网页的内容。
在这里插入图片描述
在这里插入图片描述

客户端如何知道响应的数据结束了?
如果网络断开,通信结束;
检查头部的content_length字段;
如果没有该字段,但是有transfer_encoding:chunked。表示内容采用分块传输。

在这里插入图片描述

2、实现简单的数据访问接口

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意点:线程退出会清理自己的资源,进程退出会清理所有线程资源,所以需要加锁,不然会重复释放。

数据库连接池的实现
每连接每线程的缺点:数据库一个连接,客户端和服务端都占内存(几MB到10MB);每个线程需要占用10M的虚拟内存和大于10M的固定内存;
创建线程和连接数据库需要时间;

在主进程预先创建n个数据库连接,每个线程需要用数据库时就从连接池中取一个空闲的连接,用完归还;数据库连接池需要锁保护(每个连接都有一把锁);
在这里插入图片描述
连接10个数据库,并初始化锁。
在这里插入图片描述
轮询,trylock,空闲的就上锁,返回该连接的地址
在这里插入图片描述
归还时,解锁。

在这里插入图片描述

1核2G的CPU 2000个连接只要18秒就可以了。而且还跑了数据库。用shell脚本测试的。
在这里插入图片描述

数据库连接池的优化:
1 **把前面的函数封装成类。**体现RAAI的思想,(使用局部对象来管理资源的技术称为资源获取即初始化,局部对象是指存储在栈的对象.资源的使用一般经历三个步骤a.获取资源 b.使用资源 c.销毁资源,但是资源的销毁往往是程序员经常忘记的一个环节,所以程序界就想如何在程序员中让资源自动销毁呢?c++之父给出了解决问题的方案:RAII,它充分的利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。)

2 **设定最大连接数;链接不够自动扩展,连接空闲(n秒未使用)自动断开,释放资源。**其中检查空闲连接用一个子线程来做。

3 细化获取连接池中连接的方式:
先找一个空闲的,已经连接好的连接,如果找到,返回他的地址;2、如果没有找到,在连接池中找一个未连接的connecttion,连接数据库,如果成功,返回连接的地。一个临时变量,把第一个未连接的位置记录下来。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

防止线程退出太快造成段错误:因为主线程创建一个新线程就把该线程放入容器中,但是由于线程可能退出很快,主程序还没来得及把线程id放入容器,线程清理函数没找到id,直接退出。而进程退出会取消全部线程,用循环从容器中删除,pthread_cancel(thid),这个id早就没了,所以出现错误。
正常不会这么快退出,因为当数据库连接池用完,取数据库连接地址为NULL,直接退出了,就很快。所以可以在直接退出休眠一点时间。usleep(100000);

先说之前的那部分:线程退出时的线程清理函数是关闭客户端socket,再把本线程的id从存放线程id的容器中删除,用循环。这段代码要加锁,因为容器只有一个是互斥资源(vector)。如果另一个线程先删除,那么数组大小就小了,出现段错误。这点还好理解。
注意的是进程主函数退出时,会取消全部线程,用循环从容器中删除,pthread_cancel(thid)。所以这段代码也要加锁。

线程池的实现:
主线程预先创建n个工作线程,监听客户端连接,有新连接放入待处理队列;工作线程从客户端连接中取出连接,处理请求。
细节:队列中存放的是客户端的socket; 用条件变量加互斥锁实现消息队列(生产者消费者)

其中线程总数比CPU核数略多就行。为什么不是相等,因为不是一直在跑,可能阻塞,可以让其他线程跑。太多的话没有cpu跑,切换线程浪费时间。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上面这一段是线程函数tmain.

线程池的监控
在这里插入图片描述

线程信息包括线程id和最近一次活动的时间,声明一个vector存放所有线程的信息。
然后工作线程写心跳信息。工作线程只有在cond_wait会阻塞,即缓存队列为空,修改这个wait,加上超时时间,比如20秒,20秒就会超时返回进入下一行,把自己的心跳信息改为当前时间。

监控线程:死循环不断监控,里面for循环遍历线程,如果当前时间减去线程心跳时间大于20,超时。
pthread_cancel()取消该线程,再重新创建一个工作线程,设置活动时间。

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

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

相关文章

系列四、多表查询

一、多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结 构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多…

【分组CNN:超分】

Image super-resolution with an enhanced group convolutional neural network (基于增强型分组卷积神经网络的图像超分辨率) 具有较强学习能力的神经网络被广泛应用于超分辨率问题的求解。然而,CNNs依赖于更深层次的网络结构来提高图像超…

2021.3.3idea创建Maven项目

首先new - project - 找到Maven 然后按下图操作:先勾选使用骨架,再找到Maven-archetype-webapp,选中,然后next填写自己想要创建的项目名,然后选择自己的工作空间①、选择自己下载的Maven插件②、选择选择Maven里的sett…

基于Opencv的缺陷检测任务

数据及代码见文末 1.任务需求和环境配置 任务需求:使用opencv检测出手套上的缺陷并且进行计数 环境配置:pip install opencv-python 2.整体流程 首先,我们需要定义几个参数。 图像大小,原图像比较大,首先将图像resize一下再做后续处理图像阈值处理的相应阈值反转阈值的…

git 的使用方法(上 - 指令)

目录前言:一、Git 是什么?二、SVN与Git的最主要的区别?三、Git 安装四、git 配置1. 创建仓库 - repository2. 配置3. 工作流与基本操作五、Git 的使用流程1. 仓库中创建 1.txt文件2. 查看工作区的文件状态3. 添加工作区文件到暂存区4. 创建版…

c++11 之智能指针

文章目录std::shared_ptrstd::weak_ptrstd::unique_ptr智能指针多线程安全问题在实际的 c 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如: 有…

浅谈Synchronized的原理

文章目录1.引言2.Synchronized使用方式2.1.普通函数2.2.静态函数2.3.代码块3.Synchronized原理4.Synchronized优化4.1.锁粗化4.2.锁消除4.3.锁升级4.4.无锁4.5.锁偏向锁4.6.轻量级锁4.7.重量级锁5.整个锁升级的过程1.引言 在并发编程中Synchronized一直都是元老级的角色&#…

斗地主洗牌发牌-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-4】 斗地主洗牌发牌 【案例介绍】 1.任务描述 扑克牌游戏“斗地主”,相信许多人都会玩,本案例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌,牌面由花色和数字组成…

Linux 定时任务调度(crontab)

一、Crontab Crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。 可以使用Crontab定时处理离线任务,比如每天凌晨2点更新数据等,经常用于系统任务调度。…

【Linux】冯.诺依曼体系结构与操作系统

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹冯.诺依曼体系结构什么是冯诺依曼体系结构?我们如今的计算机比如笔记本,或者是服务器,基本上都遵循冯诺依曼体系结构…

记一次web漏洞挖掘随笔

最近挖了一些漏洞。虽然重复了,但是有参考价值。这边给大家分享下。漏洞重复还是很难受的,转念一想,人生从不是事事如人意的,漏洞重复忽略,不代表失败。先来后到很重要,出场顺序很重要。1.某站rce 忽略理由…

Docker----------DockerFile解析

1. 是什么 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 官网:https://docs.docker.com/engine/reference/builder/ 1.编写Dockerfile文件 2.docker build命令构建镜像 3.docker run依镜像运行容器实例…

第47天|LeetCode392. 判断子序列、LeetCode392. 判断子序列

1.题目链接:392. 判断子序列 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如&…

Barra模型因子的构建及应用系列四之Residual Volatility因子

一、摘要 在前期的Barra模型系列文章中,我们构建了Size因子、Beta因子和Momentum因子,并分别创建了对应的单因子策略。本节文章将在该系列下进一步构建Residual Volatility因子,该策略在2022年以来跑赢大盘指数,且具有波动小的特…

Linux内核内存管理

目录 一、内核内存管理框架 二、内核中常用动态分配 2.1 kmalloc 2.2 vmalloc 2.3 kmalloc & vmalloc 的比较 2.4 分配选择原则: 三、IO访问-------访问外设控制器的寄存器 四、led驱动 1. 读原理图 2. 查阅SOC芯片手册 3. 编写驱动 一、内核内存管理…

Leetcode之消失的数字轮转数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、消失的数字一、消失的数字 二、旋转数组 提示:以下是本篇文章正文内容,下面案例可供参考 一、消失的数字 这题找出消失的一个数字&#…

自行车出口欧盟CE认证,新版自行车标准ISO 4210:2023与ISO 8098:2023发布

2023年1月,国际标准化组织ISO发布了新版“自行车以及儿童自行车的测试标准”,即ISO 4210:2023以及ISO 8098:2023,用于取代了SO 4210:2015以及ISO 8098:2015。新版标准一经发布,立即生效。欧盟标准化委员会C…

使用 Python 抓取和优化所有网站图像

,我发布了一个通过FTP自动优化新图像的教程。这次我们将抓取整个网站,并在本地优化我们遇到的图像,按URL组织。请注意,这个简短但中级的脚本不适用于大型站点。首先,所有图像都转储到一个文件夹中。为每个页面创建一个…

ASP.NET 网站开发(联合增,删,改,查)

联合多表查询查询: linqDBDataContext db new linqDBDataContext(); stu d db.stu.Where(p > p.sid 2).FirstOrDefault(); if (d ! null) { var Marks d.marks; GridView1.DataSource Marks; GridView1.DataBind(); db.Su…

理解B树及B+树、B*树

目录 一.B树概念 二.B树插入思路 二.B树分部实现 1.树节点类 2.B树成员结构 3.查找函数 4.插入函数(核心) 5.插入关键值 6.中序遍历(有序) 三.B树实现总代码 四.B树性能分析 五.B树和B*树 1.B树 2.B*树 3.总结 六…