参数配置

查看所有参数

1
mysql> SHOW VARIABLES;

慢查询、索引相关的参数

查看慢查询日志是否打开

Usage:

1
mysql> SHOW VARIABLES LIKE '%slow_query_log%';

Result:

Variable_name Value
slow_query_log OFF
slow_query_log_file /var/lib/mysql/17998065ff2d-slow.log

打开慢查询日志

阅读全文 »

本文简单介绍一下数据库的事务隔离级别,所用数据库采用 MySQLMySQL 提供了两种事务性的存储引擎 InnoDBNDB Cluster,本文示例采用 InnoDB 存储引擎。

查看当前数据的事务隔离级别

1
2
3
4
5
6
7
8
-- 查看当前数据库事务隔离级别
mysql> SHOW VARIABLES LIKE '%transaction_isolation%';
-- 或者
mysql> SELECT @@transaction_isolation;
-- 低版本的 MySQL 查看事务隔离级别的属性是不一样的
mysql> SHOW VARIABLES LIKE '%tx_isolation%';
-- 或者
mysql> SELECT @@tx_isolation;

不同的事务隔离级别所面对的问题

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)
  • 脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。

  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。

  • 幻读:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

脏读的场景

客户端 A 先开启事务,查询用户余额

1
2
3
4
5
6
7
8
9
10
11
12
-- 客户端A设置当前会话级别为`read-uncommitted`
mysq> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 客户端A开启事务
mysq> START TRANSACTION;
-- 客户端A查询用户余额
mysq> SELECT * FROM wallet WHERE user_id = 1;
-- 结果如下:
# +----+---------+-----------+
# | id | user_id | balance |
# +----+---------+-----------+
# | 1 | 1 | 100000000 |
# +----+---------+-----------+
阅读全文 »

记录常用的 JVM 参数,持续更新 …

堆内存设置

-Xms128M : 设置 java 程序启动时堆内存 128M(默认为物理内存 1/64,且小于 1G),阿里 p3c 文档中推荐 Xmx 与 Xms 配置同样的大小,避免 GC 后调整堆大小带来的压力

-Xmx256M : 设置最大堆内存 256M,超出后会出现 OutOfMemoryError(默认为物理内存 1/64,且小于 1G)

-Xmn10M : 设置新生代区域大小为 10M

-XX:NewSize=2M : 设置新生代初始大小为 2M

-XX:MaxNewSize=2M : 设置新生代最大值为 2M

-Xss1M : 设置线程栈的大小 1M(默认 1M)

-XX:MinHeapFreeRatio=40 : 设置堆空间最小空闲比例(默认 40)(当 Xmx 与 Xms 相等时,该配置无效)

-XX:MaxHeapFreeRatio=70 : 设置堆空间最大空闲比例(默认 70)(当 Xmx 与 Xms 相等时,该配置无效)

阅读全文 »

curl 是十分常用的命令,通常我们用这个命令来请求 Web 服务器。一些常见的构造 HTTP 请求的客户端(如 Postman)关于项目协作的功能都是商业化版本才有的,团队开发过程中通过维护接口的 curl 命令脚本可以低成本的代替一些商业化软件的功能。

下面介绍一下 curl 命令的常见用法。

基础用法

请求一个 URL

1
curl http://www.baidu.com/

-X

使用 -X 参数可以指定 HTTP Method

1
curl -X POST http://www.baidu.com/

-H, –header

使用 -H 或者 –header 参数可以添加 HTTP 的请求头

阅读全文 »

介绍

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件(涵盖了服务治理、配置管理、限流降级以及阿里开源生态和商业生态的诸多组件),方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

Spring Cloud 是什么

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems .

Spring Cloud 为开发者提供了快速构建分布式系统的模型。Spring Cloud 除了抽象了分布式系统里的一些接口,并且提供了一系列开箱即用的组件。

Spring Cloud 更详细的介绍以及相关的组件,可以参考官网

Spring Cloud Alibaba 对 Spring Cloud 的意义

  • Spring Cloud AlibabaSpring Cloud 体系中是一个套件,类似于 Netflix OSS,为开发者提供了更多的选择。
  • Netflix OSS 诸多重要组件先后宣布停止新功能开发的大背景下 Spring Cloud Alibaba 作为一个高速迭代中的新生项目无疑是更合适的选择。
  • 将国内非常流行的 DubboRocketMQ 等融入 Spring Cloud 体系,使得应用的接入和改造的成本更低。
  • Spring Cloud Alibaba 是中文文档最全的 Spring Cloud 组件。

组件

开源组件

阅读全文 »

在工作中,遇到一个很有意思的关于时间的问题,这里跟大家分享一下。

现象

从数据库里取出用户的生日1990-05-22,接口返回时发现返回值变成了1990-05-21,而对于1992-05-22这样的日期却能正确返回。

网上很多对于相关问题的分析都是简单粗暴的认为是时区的问题,却没有讲明白问题出现的根本原因。

排查过程

问题复现

为了复现问题现象,我们先快速搭建一个 Spring Boot Application。

先将配置文件中对日期类型的格式化配置为 yyyy-MM-dd,如下所示:

1
2
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd

写一个接口,直接将有问题的日期输出,代码如下:

阅读全文 »

记录一些常见的 Powershell 的使用问题

别名命令

在使用 Linux 系统时,我喜欢使用 ll 命令来查看当前目录的文件,但是 Windows 系统的 Powershell 没有这个命令,所以每次用的时候就很不习惯。我们可以通过对命令设置别名来让 Powershell 支持我们的使用习惯。

查看别名

Get-Alias 或者 gal 命令来查看我们系统命令的别名,如下

1
2
3
4
5
6
7
8
PS C:\Users\fuyongde> get-alias

CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias cat -> Get-Content
  • 查看某别名的原命令,如 ls 的原命令:Get-Alias ls
  • 查看某原命令的别名,如 Get-ChildItem 的别名:Get-Alias -Definition Get-ChildItem

临时创建或更改别名

使用 Set-Alias 命令来创建或更改别名,但是改命令只在当前的的 PowerShell Session 中生效。另外还有一个 New-Alias 命令用法类似。

创建不带参数的别名

阅读全文 »

记录一些常用的 Linux 操作,持续更新 …

查看系统版本

常用的查看系统版本有以下命令

  • cat /etc/os-release
  • uname -a
  • cat /proc/version
  • cat /etc/issue

下面演示一下 cat /etc/os-release,其他不详细说明。

1
cat /etc/os-release

输出如下

1
2
3
4
5
6
7
8
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

替换源

由于网络的原因,国内部分 Linux 在安装软件时非常缓慢,将源替换为国内的镜像可以方便很多。

阅读全文 »

Rpc Introduction 中简单写了一个 RPC Framework。在本节中,对 Edith 新增采用线程池支持多线程的特性。

背景

实际开发中,我们的应用程序是不能盲目的开辟线程的,这样会造成资源的极大浪费。若采用线程池,可以减少创建和销毁线程的次数,让每个线程可以多次使用,并且可以根据系统的承受能力,调整线程池中工作线程的数量,方式消耗过多的内存。

如有需要可以阅读 Dubbo 中关于线程池的设计(位于 org.apache.dubbo.common.threadpool 包)。

开发

依赖

1
2
3
4
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

Code

本文代码可以从这里获取。

新增 ThreadUtils.java

阅读全文 »

What is RPC

Remote Procedure Call (RPC) is a protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network’s details. A procedure call is also sometimes known as a function call or a subroutine call. A procedure call is also sometimes known as a function call or a subroutine call.

RPC 是一种远程过程调用协议,一个程序可以使用该协议从位于网络上另一台计算机中的程序请求服务,而无需了解网络的详细信息。RPC 有时也称为函数调用或子程序调用。RPC 是进程间通信的一种方式。

Why is RPC

网上很多关于 RPC 的优点,笔者都不太赞同。不能将那些成熟的 RPC 框架解决的问题全部归结为 RPC 的优点。比如 RPC 的概念中并没有提到服务治理等问题,但是常见的 RPC 框架(如 DUBBO)均解决了服务治理的相关问题,这显然不能作为 RPC 的优点。要解释“Why is RPC?”的问题,还是要回归到 RPC 的概念上来。

  • RPC 可以使远程过程调用变得像本地调用一样简单。
  • 方便计算能力的横向扩展。

有兴趣可以阅读 dubbo 诞生的背景 以及dubbo 解决了哪些需求

RPC vs HTTP

其实这两者不是同一个维度的概念。从 RPC 的概念上来讲,HTTP 其实就是 RPC 的一种实现。

RPC vs RMI

阅读全文 »