Git-VS-SVN
引言在软件开发过程中,版本控制是非常重要的一环。常用的版本控制工具有Git和SVN。
Git是目前世界上最先进的分布式版本控制系统,其实 Git 跟 SVN 一样有自己的集中式版本库或服务器,但是Git 更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个跟中心版本库一模一样的本地版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看log(历史版本记录),创建项目分支等。
Git和SVN的差别1、Git只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。
这类系统(如SVN)每次记录有哪些文件做了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
2、在Git 中的绝大多数操 ...
深入理解Spring
引言Spring在当前Java项目开发中可谓是核心,无论是SpringMVC、SpringBoot、SpringCloud都离不开Spring这个核心。自己对Spring的了解也停留在一知半解状态。
说起Spring,都知道是一个轻量级开源企业开发框架,包含控制反转(IOC)和面向切面(AOP)两大特性。
IOC什么是IOC(DI) IOC(Inversion Of Control,控制反转)。对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。在一个对象中,如果要使用其他的对象,就必须得到它(自己new一个或者JNDI中查询一个),使用完对象之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类耦合起来。
所有的类都会在Spring容器中登记,告诉Spring自己是什么,需要什么,然后Spring会在系统运行到适当的时候,把你需要的东西主动给你,同时也把你交给其他需要你的东西。所有类的创建、销毁都由Spring来控制,也就是说控制对象生命周期的不再是引用它的对象,而是Spring容器。对于某个具体的对象而言,以前是它控制其他 ...
说说Spring中的事务
引言在开发过程中,合理的使用事务是非常重要的。使用事务常常是为了维护高度的数据完整性和一致性。如果不关心数据的质量,就不必使用事务。毕竟,Java平台中的事务支持会降低性能,引发锁定问题和数据库并发性问题,而且会增加应用程序的复杂性。最近在面试中也是频频出现,在这里回顾加深一下。
四大特性数据库中事务有四大特性,简称为 ACID 特性。
原子性(Atomicity)事务的原子性是指事务是一个不可分割的工作单位,这组操作要么全部发生,否则全部不发生。
一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(Isolation)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(Durability)持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
隔离级别事务并发带来的问题脏读(Dirty Reads ...
JAVA并发之锁
引言锁作为并发共享数据,保证一致性的工具,数据库中有悲观锁、乐观锁等实现。在JAVA平台同样有多种实现(如 synchronized和Lock)。这些已经写好提供的锁为开发提供了便利,让我们有了更多的选择。
JAVA中锁分类乐观/悲观锁乐观锁:乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据,乐观的认为不加锁的并发操作是没有事情的。适合读操作多的场景。
乐观锁在JAVA中的使用,是无锁编程,Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(CompareAndSwap)实现的。
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
CAS操作中包含三个操作数 —— *内存值(V)、旧的的预期原值(A)和拟写入的新值(B)*。如果内存值V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B*,否则处理器不做任何 ...
HTTPS协议
引言HTTP和HTTPS协议是互联网上应用最为广泛的网络协议,现在为了安全,很多网站从HTTP的阵营转向HTTPS。近两年,Google、Baidu、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国内外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是未来互联网发展的趋势。
TCP协议TCP协议的三次握手与四次挥手先来一张网络模型图(应表会传网数物),可以看到TCP、UDP协议处于传输层。
建立TCP需要三次握手才能建立,而断开连接连接则需要四次挥手。整个过程如下图:
三次握手建立连接
1、Client端发送连接请求报文。
2、Server端接受连接后回复ACK报文,并为这次连接分配资源。
3、Client端接收到ACK报文后也向Server段发送报文,并分配资源
这就是TCP的三次握手建立连接阶段。
四次挥手断开连接
中断连接端可以是Client端,也可以是Server端。
1、假设Client端发起中断请求,也就是发送FIN报文。
2、Server端接到FIN报文后,告诉Client端,“你的 ...
Spring下MySQL读写分离
引言之前的文章已经说明MySQL主从/主主同步环境的搭建,接下来就是要实现在业务代码里面实现读写分离。在当前流行的SSM的框架开发的web项目下,数据库模式为主从同步的环境下编写业务代码。
编写jdbc.propreties在这里指定了两个数据库,主从数据库都在本地,只是端口不一致。
1234567891011121314#数据库连接池的配置jdbc.pool.init=1jdbc.pool.minIdle=3jdbc.pool.maxActive=20#mysql驱动jdbc.driver=com.mysql.jdbc.Driver#主数据库地址jdbc.master.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true#从数据库地址jdbc.slave.url=jdbc:mysql://127.0.0.1:3308/test?useUnicode=true&characterEncoding=utf-8&a ...
MySQL执行计划
引言MySQL执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL使用 explain 关键字来查看SQL的执行计划。
适用场景适用于 select、update、insert、replace、delete语句,在需要分析的语句前加EXPLAIN,即可。
EXPLAIN可得到的信息
SQL如何使用索引
关联查询的执行顺序
查询扫描的数据行数
读懂执行计划例如以下关联查询:
1EXPLAIN SELECT * FROM tb_item JOIN tb_item_desc ON tb_item.id=tb_item_desc.item_id WHERE id='679533';
根据上图可得到执行计划的列信息,下面分析一下每列所表示的信息。
## ID
ID列中的数据为一组数字,表示执行Select语句的顺序。
ID值相同时,执行顺序由上至下。
ID值越大优先级越高,越先被执行。
SELECT_TYPE表示查询中每个Select子句的类型(简单 OR 复杂)。
SIMPLE:不包含子查询或是UNION操作 ...
MySQL主从/主主复制
引言MySQL作为世界上最广泛的数据库之一,免费是原因之一,其本身功能的强大也是获得众多用的青睐的重要原因。在实际的生产环境中,单机版MySQL数据库就不能满足实际的需求了,此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器。在此之前必须要保证每台MySQL服务器里的数据同步。数据同步可以通过MySQL内部配置就可以轻松完成,主要有主从复制和主主复制。
在本案例下使用同一台机器安装两个数据库,只是端口不一致,一个为3306,一个为3308。
复制原理
Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events) 。
Slave通过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log) 。
Slave重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。
复制类型 1、基于语句的复制(st ...