SpringBoot异步线程池

概述

在实际开发中,大多数请求都是同步执行,但有的时候请求中的某个操作可能会非常耗时,我们通常会采用异步操作,下面讲解如何在 Spring 中使用异步线程池

阅读全文

Mac 上 Microsoft Autoupdate 问题解决

提示[更新已在进行中,请稍后再试]

  1. 打开活动监视器
  2. 找到 mircosoft autoupdate assistant 的进程, 关闭这个进程
  3. 再次点击更新即可

一直停留在正在安装状态

打开 iterm2, 输入以下命令打印下载的安装包所在文件夹

1
find /private/var/folders -iname "*.pkg" 2&>/dev/null

使用 finder 打开该目录,双击安装即可

Mybatis 的常用技巧

多条记录合并为一行

假如有表 stu, 有 name 列如下

name
小明
小李
小米

现在要把 name 列拼接为一行, 如 小明,小李,小米, 可以使用如下 sql

1
SELECT GROUP_CONCAT(name SEPARATOR ',') AS names FROM stu;

批量插入

1
2
3
4
5
6
7
8
9
<insert id="batchInsert" parameterType="com.xxx.UserDTO"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_user
(name, parent_name, create_time)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.parentName}, now())
</foreach>
</insert>

批量更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<update id="batchUpdate" parameterType="com.xxx.UserDTO">
UPDATE t_user
<trim prefix="set" suffixOverrides=",">
<trim prefix="name =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.name !=null">
when id=#{item.id} then #{item.name}
</if>
</foreach>
</trim>
<trim prefix="parent_name =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.parentName !=null">
when id=#{item.id} then #{item.parentName}
</if>
</foreach>
</trim>
</trim>
where id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.id}
</foreach>
</update>

in() 有序查询

1
2
3
4
5
6
7
8
9
10
<select id="findByIdsWithSorted" parameterType="java.lang.Long" resultType="com.xxx.UserDTO">
SELECT *
from t_user WHERE id IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
<foreach collection="list" item="item" open="order by field(id," close=")" separator=",">
#{item}
</foreach>
</select>

Mysql 配置参数优化

优化最大连接数

max_connections 是 MySQL 最大并发连接数,默认值是 151
MySQL 允许的最大连接数上限是 16384
实际连接数是最大连接数的 85% 较为合适

查询数据库目前设置的最大并发连接数是多少?

1
SHOW VARIABLES LIKE 'max_connections';

查询数据库目前实际连接的并发数是多少

1
SHOW STATUS LIKE 'max_used_connections';

在 MySQL 配置文件 /etc/my.cnf 中设置 max_connections=3000,表示修改最大连接数为 3000,需要重启 MySQL 才能生效

MySQL 为每个连接创建缓冲区,所以不应该盲目上调最大连接数,如果最大连接数达到了上面设置的 3000,会消耗大约 800M 内存。

优化请求堆栈

back_log 是存放执行请求的堆栈大小,默认值是 50
该值设置为最大并发连接数的 20%~ 30% 较为合适
同样是在 MySQL 配置文件 /etc/my.cnf 中,设置 back_log=600,修改后需要重启 MySQL 才能生效

修改并发线程数

innodb_thread_concurrency 代表并发线程数,默认是 0,表示没有设置线程数量的上限。
不是分配给 MySQL 的线程越多越好,线程多反而会损耗 cpu 性能,导致速度变慢
并发线程数应该设置为 cpu 核心数的两倍

在 MySQL 配置文件 /etc/my.cnf 中,设置 innodb_thread_concurrency=8

查看 cpu 型号

1
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

查看 cpu 核心数

1
cat /proc/cpuinfo | grep "cores"|uniq

修改连接超时时间

wait-timeout 是超时时间,单位是秒
连接默认超时为 8 小时,连接长期不用又不销毁,浪费资源
设置超时时间为 10 分钟 wait-timeout=600

InnoDB 缓存

修改 InnoDB 缓存大小

innodb_buffer_pool_size 是 InnoDB 的缓存容量,默认是 128M

InnoDB 缓存的大小可以设置为主机内存的 70%~ 80%

在 MySQL 配置文件中,会有一行被注释的配置:# innodb_buffer_pool_size = 128M

上方注释也写明了,建议设置物理内存的 70%

1
2
3
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

Linux按日期备份命令

1
2
# 把 nginx.conf 及 sites-available, sites-enabled 目录压缩以日期结尾备份
tar -czvf nginx_$(date +'%F_%H-%M-%S').tar.gz nginx.conf sites-available/ sites-enabled/

Docker微容器 Alpine Linux

简介

使用 Docker 创建容器时,基础镜像通常选择 Ubuntu 或 Centos,不管哪个镜像的大小都在 100MB 以上。

Alpine Linux 是一个面向安全的轻型的 Linux 发行版。

Alpine Linux 采用了 musl libcbusybox 以减小系统的体积和运行时资源消耗。

在保持瘦身的同时,Alpine Linux 还提供了自己的包管理工具 apk。

关键的是,相比于其他 Linux 的 Docker 镜像,它的容量非常小,仅仅只有 5MB。

Alpine Linux 的官网:

http://www.alpinelinux.org/

https://pkgs.alpinelinux.org/packages

阅读全文

Docker 远程安全访问

直接设置任意远程访问存在的问题

因为 docker 默认是 root 权限,允许所有人访问,直接把 2375 端口暴露在外网相当于直接把服务器的 root 权限拱手送人,因此我们需要构建一个加密的 TCP 链接,以 Https 的方式连接到远程的 docker 服务器

阅读全文