永远的万事屋

锈在一起的三角铁


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

由使用mybatis批量插入功能联想到的

发表于 2018-09-13 | 分类于 技术

先说说由来

新项目中有批量插入的功能,然而在其他项目中没有找到批量插入的写法,我们都知道,我们使用jdbc的时候是可以指定批量模式的,然而在这里并没有看到我想要的有关批量的设置,所以决定去找找批量使用方式。

自己对mybatis的认识过程

查找了不少资料,有细心网友总结的三种方式https://blog.csdn.net/m0_37981235/article/details/79131493。不过我认为只有其中的第二种,指定批量模式的才是真正的批量操作。

例子中用的SqlSession,SqlSessionTemplate是SqlSession的一个实现,我们可以使用SqlSessionTemplate 来代理以往的DefailtSqlSession完成对数据库的操作,相比于DefaultSqlSession,SqlSessionTemplate是线程安全的,可以被设置成单例的。

阅读全文 »

Proxy

发表于 2018-09-08 | 分类于 技术

先讲讲由来

最近项目中要写一个统一的异常拦截,并且打日志的功能,所以很自然的想到了切面,并且很自然想到了spring的aop。

先讲一个spring的aop

spring有好几种方式使用apo:

  1. 使用MethodInterceptor
  2. 使用声明式aop()
  3. 使用aop注解(@Aspect)

再具体的细节我就不讲了,有很多优秀的文章都讲了如何使用https://www.cnblogs.com/jacksonshi/p/5863313.html,
看到这里的时候对aspect产生了兴趣。

再讲讲aspect

aspect翻译为切面,和面向对象编程一样有面向切面编程(AOP),目前有一个非常出名的面向切面编程的框架AspectJ,它定义了自己的切面语法,还有自己的织入工具。对于spring来说,其实也是用AspectJ的预发定义了切面的规则,但它背后使用了cglib的动态代理,没有使用AspectJ的织入代码。这里有一篇很不错的文章介绍了AspectJhttps://juejin.im/entry/5a40abb16fb9a0451e400886

阅读全文 »

Treap

发表于 2018-08-21 | 分类于 技术

Treap是什么

Treap是Tree+Heap,也是一种二叉查找树。它相对于二叉树多了priority的概念。
它具有二叉树和堆的特性:

  1. Treap是关于key的二叉排序树(也就是规定的排序方式)。
  2. Treap是关于priority的堆(按照随机出的优先级作为小根/大根堆)。(非二叉堆,因为不是完全二叉树)
  3. key和priority确定时,treap唯一。

Treap依赖于随机数,随机生成的优先级属性,通过简单的左右旋可以将长链旋转成近似完全二叉树结构。

Treap是如何做到近似完全二叉树的呢?

拿插入来说,先按照key的大小添加到二叉树上,再按照priority旋转二叉树。因为priority是随机分配的,所以在一定的概率上不容易导致单链条的二叉树,这就是Treap最根本的特点。

IO

发表于 2018-08-16 | 分类于 技术

先推荐两篇非常不错的文章

https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral
https://www.cnblogs.com/aspirant/p/9166944.html

先给IO分个类


我们平时总是提到的一些名词都在图里了,需要关注的是,NIO、IO多路复用,都属于同步IO。
到这里我们就清晰了,我们最常提的select、poll、epoll其实都是同步IO。

再讲讲什么是IO操作

先同步两个概念:

  1. 内核空间(kernel)
  2. 用户空间(user)

输入操作一般包含两个步骤:

  1. 等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。
  2. 将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。
阅读全文 »

文件描述符

发表于 2018-08-15 | 分类于 技术

为什么想了解文件描述符

对于文件描述符这个概念我们也是听的很多了,但关于他具体是什么,我也总是之乎者也。看到了select模型,又提到文件描述符的最大1024数量的限制,觉得有必要了解下了。

不错的文章推荐

这里有很不错的两篇文章:
https://blog.csdn.net/yanjun_1982/article/details/79421528
https://my.oschina.net/iuranus/blog/330397?fromerr=x1SVuj0Z

什么是文件

unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。
不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种分层和抽象的思想。

我的理解

文件描述符(fd)就是一个可以定位到文件对象的对象(如果万物皆对象概念的话)

最后说一下select

select模型受文件描述符限制,是由于他使用了文件描述符表,而一个进程的文件描述符表的最大size是一定的。

encode的理解

发表于 2018-06-18 | 分类于 技术

这片文章写的很不错,受益匪浅,推荐之。https://blog.csdn.net/softwarenb/article/details/51994943

Heap

发表于 2018-06-18 | 分类于 技术

###完全二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

堆

堆(heap)也被称为优先队列(priority queue)。堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的,这个优先顺序可以是元素的大小或者其他规则。如图一所示就是一个堆,堆优先顺序就是大的元素排在前面,小的元素排在后面,这样得到的堆称为最大堆。最大堆中堆顶的元素是整个堆中最大的,并且每一个分支也可以看成一个最大堆。

堆的存储

堆可以看成一个二叉树,所以可以考虑使用二叉树的表示方法来表示堆。但是因为堆中元素按照一定的优先顺序排列,因此可以使用更简单的方法——数组——来表示,这样可以节省子节点指针空间,并且可以快速访问每个节点。堆的数组表示其实就是堆层级遍历的结果。

插入

堆还可以看成一个完全二叉树,每次总是先填满上一层,再在下一层从左往右依次插入。堆的插入步骤:

  1. 将新元素增加到堆的末尾
  2. 按照优先顺序,将新元素与其父节点比较,如果新元素小于父节点则将两者交换位置。
  3. 不断进行第2步操作,直到不需要交换新元素和父节点,或者达到堆顶
  4. 最后通过得到一个最小堆

    删除

    堆的删除操作与插入操作相反,插入操作从下往上调整堆,而删除操作则从上往下调整堆。

  5. 删除堆顶元素(通常是将堆顶元素放置在数组的末尾)

  6. 比较左右子节点,将小的元素上调。
  7. 不断进行步骤2,直到不需要调整或者调整到堆底。

AVL Tree

发表于 2018-06-18 | 分类于 技术

##二叉树
每个节点最多有两个子节点

##二叉查找树
左节点小于父节点,父节点小于右节点
时间复杂度:logN <= O(h) <= N

##自平衡二叉查找树
AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。通过旋转维持平衡,降低时间复杂度。

###旋转轴节点
想要确定旋转轴节点需要先知道几个概念。

  1. 平衡因子:二叉树某节点左右子树高度差(左减右为正还是右减左为正可自定义,下面的例子假定左减右为正)
  2. 最小不平衡子树:以距离插入节点最近的且平衡因子绝对值大于1的节点为根节点的子树
  3. next larger:是指比某个node A 大的值,但是比所有其他大于node A的nodes 都要小;比较绕口,其实本质就是在所有比node A 大的集合中,key值最接近node A 的哪一个node
  4. next smaller:同理next larger

旋转轴节点的确定,是由最小不平衡子树的平衡因子的正负,来决定找最小不平衡子树根节点的next smaller或者next larger。如果最小不平衡子树的平衡因子为正,其旋转轴节点为其root节点的next smaller;反之同理。 并且旋转轴节点是新子树的根节点。
可以试着用上面的方法确定以下二叉树的旋转轴节点:

###旋转
旋转的目的是,通过降低左右子树的高度,来达到平衡。
首先我们需要知道,我们的旋转对象,或者说平衡目标,是什么?大家可能都知道了,上面我们已经多次提到了,就是最小不平衡子树。
因为自平衡二叉树查找树每一次插入新节点后,都要检查是否破坏了平衡,如果破坏了平衡都会通过旋转来保持平衡。所以说每一次的不平衡状态的平衡因子都只可能为-1或者1,也就是说我们只要解决了最小不平衡子树的不平衡,将其挂在其原有根节点的位置,也就是解决了整棵树的不平衡。

旋转分为两类,单旋转和双旋转。

  1. 单旋转
    当最小不平衡子树的平衡因子与其子树(新加节点路径上的子树)的平衡因子为同符号性质(同为正/负号)时单旋转。
    如果不存在左孩子,左旋转会将父节点挂在旋转轴的左孩子处;如果存在左孩子,则需要和做孩子对比大小,如果比其左孩子小的话,就挂在其左孩子的左节点,如果比其左孩子大的话,就替换为其孩子的位置,原来的左孩子挂在新的做孩子的左节点。右旋转的操作同理。
  2. 双旋转
    当最小不平衡子树的平衡因子与其子树(新加节点路径上的子树)的平衡因子为异符号性质(正负/负正)时双旋转。
    双旋转就是需要旋转两次,LR或者RL。
    以下是一个双旋转RL的过程:

学习小组第一期总结

发表于 2018-05-08 | 分类于 技术

refactoring(重构)是我们整天挂在嘴边的,也有很多我们自己写代码的技巧,而Refactoring improving the Design of Existing code这本书就是把我们那些技巧总结整理下来,归纳为方式方法,这本书里基本囊括了我们平时所有重构的技巧,看这本书当中我们会惊叹原来我们平时使用的这些在很早之前就有人整理出来了,大神就是大神。
以下我就列举几点典型的方法:

  1. Extract Method
    额外的函数适合于重构过长的函数,把其分解成多个独立功能的函数,函数功能单一使人更容易理解,以及修改才更不容易出错。
  2. Move Method
    移动函数适合于逻辑的理解,本质上一个函数式可以放在任何位置的,但我们要去思考这个函数的功能,以及这个函数放在什么位置更易于理解。
  3. Replace Temp With Query
    临时变量往往引发问题,他们会导致大量参数被传来传去,这就导致我们有可能会改变变量的值,而这种改变通常是错误的,尤其是在很长的函数体内。

借用书中的话来描述重构的意义:任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。

阅读全文 »

docker学习笔记

发表于 2018-04-27 | 分类于 技术

docker image ls //列出本地镜像
docker image rm ${image id} //删除本地镜像
docker build -t tomcat . //. 表示Dockerfile在当前文件夹下,也可使用绝对路径(/path/to/Dockerfile)来表示
docker run –name mytomcat -i -t -d tomcat:latest //使用镜像启动docker容器
docker run -i -t -d -p ${host port}:${container port} –name mytomcat tomcat:latest //docker端口映射
//docker是运行在linux环境之上的,所以在windows下使用是运行在虚拟机上的,这里的host(宿主)只的是vm
${host ip}:${host port} //访问docker里运行的tomcat
docker restart ${container name} //重启容器
docker attach ${container id} //
docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID

docker ps -a // 查看所有容器
docker ps -a -q // 查看所有容器ID

docker stop $(docker ps -a -q) // stop停止所有容器
docker rm $(docker ps -a -q) // remove删除所有容器

docker inspect ${container id} //获取容器/镜像的元数据
docker inspect ${container id} | grep IPAddress //查看元数据,过滤ip

1…3456
baiyang

baiyang

做海贼王的油腻男人

52 日志
3 分类
31 标签
RSS
GitHub
© 2020 baiyang
由 Hexo 强力驱动
主题 - NexT.Pisces
访问人数 总访问量 次