zyc的博客

疾风亦有归途

概述

常用的网络IO模型主要有阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO这5种IO模型。而IO的本质则是用户空间与系统内核空间之间的数据拷贝,并且这个数据拷贝分为两个阶段:

  1. 内核准备数据
  2. 内核拷贝数据到用户进程

而这5种IO模型的区别就是在两个阶段上各有不同的情况。

阅读全文 »

概述

spring将Java Transaction API (JTA), JDBC, Hibernate, 和Java Persistence API (JPA)这些不同的事务api抽象成了统一的编程模型,其中TransactionManager作为spring事务的顶级接口负责声明一个事务管理器,PlatformTransactionManager则继承了该接口提供了事务的获取、提交、回滚的基本声明,通常我们可以通过编程式和声明式这两种方式来编写我们的事务代码,编程式事务通常是利用事务管理器来手动获取事务最后提交或者回滚,而声明式事务则是最为常见的使用方式,也就是我们在方法或类上标注的@Transactional注解。

阅读全文 »

概念

MySQL Server维护几个时区变量

  1. 系统时区

    mysql在启动时会获取目标机器上的时区值作为全局变量system_time_zone的值,此后该值不变。如果是通过mysqld_safe命令来启动的可以通过–timezone在启动时设置该值

  2. mysql当前运行时区

    全局变量time_zone代表了mysql服务器的当前正在运行的时区,time_zone的初始值为’SYSTEM’,代表当前时区值为system_time_zone,可以在启动mysql时通过–default-time-zone设置该值,或者在mysql配置文件中配置default-time-zone=’timezone’

  3. 会话时区

    每个客户端连接都能设置自己的时区,可以通过会话参数time_zone设置(SET time_zone = timezone;)每个会话的初始时区值是从全局变量time_zone中获取的,即每次会话的默认时区值为全局变量time_zone值。
    注意会话时区的改变会影响NOW()或CURTIME()的返回值,同时对于那些类型为TIMESTAMP的字段,会将会话时区转换为utc时区存储到表中以及将utc时区转换到会话时区展示。不过对于date、time、datetime类型字段的查询没有任何影响。

    阅读全文 »

概述

数据库事务( transaction)是访问并可能操作数据库中数据项的一个操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

阅读全文 »

概述

ScheduledThreadPoolExecutor提供了在给定的延迟时间之后或者以固定的速率执行任务的机制,也就是我们平时所说的任务调度。ScheduledThreadPoolExecutor本身是继承了ThreadPoolExecutor,与ThreadPoolExecutor不同的是它屏蔽了对maximumPoolSize的支持,仅仅使用corePoolSize作为固定大小线程池,其内部是通过一个以数组实现的最小堆无界队列来保存那些被调度的任务,执行这些任务的线程只能是核心线程,也就是说当我们有2个耗时为2秒的周期任务需要每隔2s需要执行一次的话,如果核心线程数为1,那么其中一个任务必须等待另外一个任务执行完毕才有可能执行。

阅读全文 »

概述

在上一篇的Spring-Security-OAuth2-Client文章中我们详细讲解了一个客户端应用是如何通过OAuth2的标准授权协议请求授权服务器获取token的流程,那么当客户端获取到token之后,肯定是要拿着这个token去请求资源服务器获取资源的,也就是说资源服务器的作用其实就是对客户端token的认证和鉴权,只要token校验通过,那么客户端就能拿到相应的资源,这样client和resource-server就衔接起来了,接下来我们就来对spring-security的resource-server的解析流程一探究竟。

阅读全文 »

概述

OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。网上有很多关于OAuth协议的讲解,这里就不在详细解释OAuth相关的概念了,请读者自行查阅相关资料,否则本文接下来的内容可能会很难理解。

阅读全文 »

概述

在上一篇ThreadPoolExecutor概述中我们知道了线程池是通过一个int值的高3位代表线程池的运行状态,低29位代表线程池中的线程数,同时我们也了解了线程池中的各个参数的含义,知道了核心线程与非核心线程的区别,非核心线程只会在线程池中的线程数量大于corePoolSize并且小于maximumPoolSize时,并且任务队列已满的情况下才会创建一个新线程来处理任务。本章将基于这些基本的知识点来深入研究线程池执行任务的机制。

阅读全文 »

概述

ThreadPoolExecutor是ExecutorService的一个基本实现,可以通过调整ThreadPoolExecutor的参数来获取不同效果的线程池(参考Executors)。线程池提升了处理大量异步任务的效率,同时能够重复利用已创建的线程以减少创建和销毁线程带来的开销。本文主要对ThreadPoolExecutor的一些基本概念进行阐述,为后续深入研究线程池原理做铺垫。

阅读全文 »