个人配置说明:5.7.24 MySQL Community Server (GPL),环境CentOS 7 1.MYSQL 不支持语句触发(for each statement),只支持行触发(for each row,新旧数据通过关键字new和old区别) 实验: 数据库存储和触发器实验 一、实验目的 理解,实现并逐渐熟悉存储过程的使用 存储过程(Stored Procedure)是指一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。使用它的目的主要是它不用像SQL语句一样解释执行,而是相当于二进制文件直接运行即可,提高了效率. 掌握触发器的定义和使用 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。这在实际使用过程中非常实用.作为一名合格的数据库管理人员,是必须要掌握的.这节实验的目的也在于此. 二、实验环境 MYSQL 三、实验前准备 (1)准备电脑,课本(数据 继续阅读 >>


刘生玺 18/12/29 11:47:19
彻底理解 fork 之写时复制 《一》 一直以来都对操作系统都比较感兴趣,这篇文章呢就主要研究一下当我们调用fork系统掉用所用到的写时复制技术(copy-on-write)。 下图是fork系列函数的调用过程 <摘自网络 侵删> 写时复制,其实在很多地方都会用到,我们先来看看关于字符串使用写时复制的例子吧。 写时拷贝故名思意:是在写的时候(即改变字符串的时候)才会真正的开辟空间拷贝(深拷贝),如果只是对数据的读时,只会对数据进行浅拷贝。 写时拷贝:引用计数器的浅拷贝,又称延时拷贝 :写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减一,新分配的空间引用计数加一)。 基于此 我们来再看看调用 fo 继续阅读 >>


刘嘉辉 18/12/29 11:31:33
我们都知道,当我们要在一个集合中查找数据时,如果这个集合是顺序表且我们能确定要找的数据在顺序表中的位置的话,我们就能通过下标直接找到元素,这无非是我们要追求的最高效的查找策略!但是现实总是那么骨感,在大多数情况下,要在茫茫数据海洋中找某些关键信息,是不可能直接找到的。因为我们并不知道我们要找的数据与其所在位置之间是否存在某种关联。 所以我们在存储数据时,建立如同顺序表形式的可以按照下标进行查找的存储集合,然后我们可以认为建立要存的关键信息和其在集合中的下标之间的关系,这样我们在找想找的信息时,就可以确定信息在集合中的下标了,这样就可实现较为高效的查找了。而我们所说的这个集合就称为哈希表,建立的下标与信息的关系可以通过哈希函数(自定义合理的函数)来实现。 哈希表在查找,加密等很多方面都有广泛用途。 今天我用拉链法建立了简单的哈希表其结构如图所示: 源码 #include <iostream> #include<array> #include<memory> 继续阅读 >>


畅柯 18/12/26 23:43:15
高性能定时器(一) 先来三句口号 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 前几日学习了一下定时器 首先吐槽一下,最近学的东西感觉都听上去很高大上,但是自己一接触发现也就那么回事,像是一位长发飘飘的白衣女子,可是又何必回身过来乱了芳华。 哈哈哈,废话就不多说了。 开篇题为高性能定时器,这次呢我们根据定时器的种类大致上分为三个模块,基于链表的定时器,还有两个比较常用的高性能定时器,时间轮和时间堆 不过在具体地讨论如何组织定时器之前,我们先要介绍一下定时的方法。定时是指在一段时间后触发某段代码的机制。换言之,定时器机制是定时器得以被处理的原动力。linux 提供三种方法,如下所示: socket选项SO_RCVTIMEO 和 SO_ 继续阅读 >>


刘嘉辉 18/12/26 23:03:01
多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果就是按顺序执行,也就是同步的,阻塞的. synchronized同步方法 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized同步方法中的代码 synchronized(this)同步代码块 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码 其实Java还支持对"任意对象"作为"对象监视器"来实现同步的功能. 这个任意对象大多数是实例变量及方法的参数 synchronized(非this对象x)同步代码块 在多个线程持有"对象监视器"为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象 继续阅读 >>


贺含悦 18/12/26 22:31:44
2018年12月26日: ConcurrentHashMap的源码已经分析了不知多长时间,我真的很想吐槽(憋不住了),这东西是真尼玛的不好理解,总觉的分析这个东西没多大用处,但是已经开始了的事情,怎么能轻言放弃!最后再吐槽一下,ConcurrentHashMap你是真滴牛逼(这样下去非得掉头发不可)! 作者:championhengyi 发表于 2018/12/26 13:56:56 原文链接 https://blog.csdn.net/championhengyi/article/details/85260981 阅读:117 评论:2 查看评论 继续阅读 >>


董恒毅 18/12/26 13:56:56
迪杰斯特拉算法 数据结构图这一部分中的迪杰斯特拉算法,在实际中找最短路径应用广泛,本篇博文主要描述它的实现思路。准备另一篇再将代码实现陈述一遍,主要目的是让其在我脑海中刻骨铭心一点。因为这个算法已经让我耗费了不少的时间和精力。 i代表下标,Y右侧代表已经访问过的路径,= 标记已经找到最短路径,pm代表上一个已经找到最端口路径的节点,每一列的数字表示从原点到当前节点之间的长度,无穷表示没有可达路径。(由于空间有限还有本人较懒,就写一下开始的路径,后面就不写了)。 i N \ Y A B C D G E F 2 B 2(A->B) = = = = = = 3 C 4(A->B) 3(A->B->C) = = = = = 4 D ∞(A->B) 5 5 = = = = 5 E ∞(A->B) ∞ ∞ 7(A->B->D->E) 6(A->B->C->G->E) = = 6 F ∞(A-> 继续阅读 >>


畅柯 18/12/25 21:13:33
慢系统调用 概念: 慢系统调用指的是可能永远阻塞的系统调用。 例如,pause或wait或accept或读管道时,可能永远阻塞。 EINTR错误 EINTR错误产生的原因:在慢系统调用阻塞的时候,若有个信号发送过来(因为信号是异步的,可能随时过来),并且这个信号没被忽略,那么就会中断这个系统调用,并且把errno置为EINTR。然后就会执行后面的代码。 解决方法 1.重新执行这个慢系统调用(如下图以wait为例),但是有的系统调用不能重新去执行,比如connect //让父进程等待所有子进程 while(1) { int a = wait(); if(a == -1) { //如果errno == EINTR,说明是信号中断了 if(errno == EINTR) continue; //没有子进程就退出 break; } } 2.安装信号时设置SA_RESTART属性 继续阅读 >>


马艺诚 18/12/25 15:48:43
Using Asio with C++11 这篇文章既作为Asio网络库的一个介绍,也作为Asio网络库与C++11进行协同实现和使用的一个简单的概览。 本文主要介绍的不是跟随Boost发布的Asio库,而是Asio独立于Boost的一个版本,我们所介绍的这个版本的Asio有以下几个目标: 在库接口上使用C++11语言和标准库特性。 证明这个库可以在仅仅使用C++11标准库和操作系统提供的设施下实现 你可以在这里找到这个版本的Asio源代码: http://github.com/chriskohlhoff/asio/tree/cpp11-only 使用I/O流来解决简单情况 在很多应用程序里,网络环节不是其核心特性,也不把网络环节看做应用开发者的核心竞争力。那么,为了迎合这些情况,Asio提供了一个TCP套接字的高阶抽象的接口,它是根据大家很熟悉的C++输入输出流(iostream)来设计的。 用这个方法来使用这个库的话,创建一个流对象将异常简单,简单到仅仅需要提供远程主机的一些细节,下面就是一个构 继续阅读 >>


娄泽豪 18/12/24 17:37:17
7层通信 在七层osi模型中是如何实现通信的呢。参考上图。 首先,发送方从第七层(应用层)到第一层由上至下发送数据,而接收端刚好相反从下至上接收数据。发送端再处理上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。接收端对收到的数据进行数据“首部”与“内容”的分离,再转发给上一层,并最终将发送端的数据恢复为原状。 应用层 假设A要给B发送一个邮件,发送的邮件分为两部分,一部分是内容,另一部分是收件人。内容是与通信无关的内容,而将内容发送给B则是与通信有关的内容。 从用户输入完成要发送的内容并“点击”发送按钮的那一刻开始,就进入了应用层协议的处理。该协议会在所要传送的数据的前端附加一个首部(标签)信息。该首部标签表明了“内容”和“收件人B”。当接收端的应用层处理是,会获取内容,并且得知该邮件是A发给我的,并且将邮件内容保存的硬盘中。如果无法写入硬盘,则会返回一个错误给发送方。这就是应用层的作用。 表示层 在我们的生活中,应用的软件不同也会导致数据的表现形式不同。例如有字处理的软件只能由该字处 继续阅读 >>


朱文博 18/12/24 12:22:01