2025-03-13
linux相关
00

linux

正则表达式

image.png

2025-03-12
pyhton
00

背景

在生产环境中,我们使用了 pymysql 和 DBUtils.PooledDB 来管理 MySQL 数据库连接池。由于业务量激增,新增了多个业务实例,最终导致 MySQL 集群以及本地实例的连接数被打满,无法建立新的请求连接。经过排查,发现根本原因是 pymysql 默认开启事务,所有的 SQL 操作(包括查询)都会自动开启事务,并且不会自动提交,导致事务长时间占用连接,无法释放。

问题原因

1. 默认事务行为
  • pymysql 默认 autocommit=False: pymysql 默认不自动提交事务,也就是说,每执行一次 SQL 操作(包括查询)都会启动一个事务。如果在业务代码中没有显式调用 commit() 或 rollback(),那么这个事务就一直处于挂起状态。
2. 连接池连接占用
  • 事务不释放连接: 当一个连接处于挂起事务状态时,即使执行的是查询操作,该连接也不会被释放回连接池。随着大量任务的执行,长时间未提交的事务不断占用连接池中的连接,最终导致连接数打满。
3. 业务实例增加导致压力骤增
  • 新增业务实例后,同时发起的大量请求进一步加剧了连接数的压力,最终导致 MySQL 集群无法创建新的请求连接。
2025-03-04
pyhton
00

python debug配置

python以模块的方式进行debug

背景:

正常python文件进行debug时,可以直接运行,但是遇到一个python的框架项目,直接运行或者debug都会报错server包不存在(server是一个文件夹,下面并没有init文件,但存在多个业务文件,以及程序入口文件)

排查

  1. 经过一定的排查发现,项目需要以模块的方式进行运行(python -m server.server)这里的server.server对应的是server下的server.py文件
  2. 这时debug时,肯定也需要以模块的方式进行运行,但这里发现,直接使用program的方式是无法直接运行的,需要进行调整,经过一系列研究,发现需要将program调整为module,具体参考如下:
2025-03-03
golang
00

接口的理解

在 Go 语言中,只要一个类型实现了某个接口,那么它就可以作为该接口的实例被使用

go
package main import "fmt" // 定义一个接口 Speaker type Speaker interface { Speak() } // 定义一个结构体 Dog type Dog struct{} // 让 Dog 实现 Speak 方法 func (d Dog) Speak() { fmt.Println("汪汪汪!") } // 定义一个结构体 Cat type Cat struct{} // 让 Cat 实现 Speak 方法 func (c Cat) Speak() { fmt.Println("喵喵喵!") } // 定义一个通用的说话函数 func MakeSpeak(s Speaker) { s.Speak() // 只要是实现了 Speaker 接口的类型都能调用 } func main() { dog := Dog{} cat := Cat{} // Dog 和 Cat 都实现了 Speaker 接口,因此可以作为 Speaker 传入 MakeSpeak(dog) MakeSpeak(cat) }
2025-02-27
pyhton
00

相关信息

json.dumps进行字符串转json转换以及序列化的时候,一定要增加ensure_ascii=False参数,否则的话,默认会转化为ascii字符