flask自动重连数据库

2018年9月12日 07:43

情况描述

flask部署到服务器后,日志中经常出现错误
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (ConnectionResetError(104, 'Connection reset by peer'))")
 
看下mysql日志,大量的超时导致的连接中断
...
2018-09-10  6:45:41 768 [Warning] Aborted connection 768 to db: 'xxx' user: 'xxx' host: '172.22.0.2' (Got timeout reading communication packets)
 

问题原因

原因就是因为连接超时,数据库把它中断了,详细参见官方文档.
https://dev.mysql.com/doc/refman/8.0/en/communication-errors.html
 

起因

  • 查看数据库配置。不要混淆全局配置与会话配置
show global variables like '%timeout%'

connect_timeout      5
interactive_timeout  28800
wait_timeout      600
 
  • 配置文件my.cnf
connect_timeout         = 5
wait_timeout            = 600
 

错误复现

mysql错误日志两次中断间隔时间都大于600秒,有可能是该参数引起,将它设置小点看看,能否复现问题
set global wait_timeout=10
 
设置后,问题又出现了,可以缺点就是该参数引起的。
 

自动重连实现

无论wait_timeou设置多大,总会出现超时,该怎么避免呢?简单方法是定时重连接.
 
flask已经提供了重连参数。连接超过一定时间就将它回收。
SQLALCHEMY_POOL_RECYCLE=7200   # 默认2小时。该值一定要比数据库wait_timeout小,否则它不起作用,上面就是这个原因导致的
 
当然这个方法不会帮我们处理网络异常导致的连接失效时重连
 
《了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)
此生必看的科学实验-水知道答案

 

Tags: flask
评论(0) 阅读(348)

sysbench测试mysql性能瓶颈

2018年9月06日 05:56

前言

任何系统,业务越来越繁忙,最终都会遇到性能瓶颈。能够提前知道系统大概的瓶颈,是很重要的。下面介绍一个测试工具sysbench
 

安装

yum install sysbench
#下面测试中版本是1.0.9
 

github

https://github.com/akopytov/sysbench
 

测试mysql

sysbench --test=/usr/share/sysbench/oltp_insert.lua
--mysql-host=127.0.0.1
--mysql-port=3306
--mysql-user=root
--mysql-password=111111
--mysql-db=mytest
--db-driver=mysql  prepare
 
  • * 参数选项
--test 指定测试所用lua脚本
--mysql-host
--mysql-port
--mysql-user
--mysql-password
--mysql-db
--db-driver=mysql  #指定db类型
prepare 测试前准备工作
run 正式测试
cleanup 测试后删掉测试数据
 
  • * lua脚本的参数选项
详细参数看lua脚本/usr/share/sysbench/oltp_common.lua
下面是常用参数
--mysql_storage_engine=innodb   #表引擎
--table_size=10000              #表大小
--tables=10                     #表数量
 
《了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)
此生必看的科学实验-水知道答案
 

Tags: sysbench
评论(0) 阅读(354)

快速生成千万条mysql数据

2018年9月06日 05:33

目的

学习、测试mysql大数据场景,需要先生成大量数据。
 

思路

mysql官方文档说得很清楚。"load data infile"导入数据比insert要快20倍。所以我们先生成一千万条数据的文件。
然后将数据导入表中。
 
## 生成数据
假如有个用户表(id, username,password, age, sex),id是自动增长,我们现在需要生成username等信息
生成一千万条数据,速度还能接受,耗时236秒,文件大小315M。
 
import string
import random

def random_str(length=1):
    template = string.letters + string.digits
    chars = random.sample(template, length)
    return "".join(chars)

def generate_record():
    """
    username/password/age/sex
    """
    length = random.randint(6, 20)
    username = random_str(length)

    length = random.randint(6, 20)
    password = random_str(length)

    age = random.randint(10, 100)
    sex = random.choice([0, 1])
    return [username, password, age, sex]

def create_file(num=10000000):
    with open("user_data.txt", "w") as f:
        for i in range(num):
            row = generate_record()
            f.write(",".join(map(str, row))+"\n")

if __name__ == '__main__':
    import datetime
    start = datetime.datetime.now()
    create_file()
    end = datetime.datetime.now()
    cost = (end -start).total_seconds()
    print("cost: %s" % cost)
#一千万条,耗时236s,文件315M
 

导入

load data infile命令有安全限制,最好是把数据拿到mysql server端,再通过mysql -uxxx -pxxx进入命令,再导入。
我的虚拟机导入耗时57秒
 
load data infile "/user_data.txt" into table user
fields terminated by ','
lines terminated by '\n'
(username, password, age, sex);
 
 

其它方式

  • 测试工具sysbench
sysbench是批量insert,性能比不上导入。但是它更接近实际场景
 
  • 存储过程
速度很快,但是不如用熟悉的脚本方便
 
此生必看的科学实验-水知道答案
《了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)
 

Tags: python
评论(0) 阅读(337)

执著与淡然

2018年9月06日 05:03

执著的人靠谱,但是容易起冲突。
淡然的人,不会起冲突,可能不靠谱。

评论(0) 阅读(318)

彻底关闭win10自动更新

2018年7月15日 19:20

win10更新非常讨厌,一不注意,重启后自动更新,等半个小时都不能进系统。
 
发现大部分的方法是禁用服务。然后每次重启系统后,又发现它被改回来了,也不知道是被什么东西改的。
 
没心思去有修改配置,直接卸载掉,不跟它玩
 
右键以管理身份运行cmd
C:\Windows\System32\cmd.exe
 
运行命令卸载服务
sc delete wuauserv
 
《了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)

 

评论(0) 阅读(730)

pelican AttributeError: 'unicode' object has no attribute 'slug'

2018年7月08日 16:06

pelican生成html报错,原因是网上的教程有错误。pelican默认支持rst格式,创建md格式文章,根本没有编译,所以网上教程不会报错
 
如果支持markdown需要安装”pip install markdown”。安装之后编译出现如下错误。
 
(pelican) ➜  xuefo make html
pelican /home/wyq/me/workspace/xuefo/content -o /home/wyq/me/workspace/xuefo/output -s /home/wyq/me/workspace/xuefo/pelicanconf.py 
CRITICAL: AttributeError: 'unicode' object has no attribute 'slug'
make: *** [Makefile:65:html] 错误 1
 
错误方式
Title: 文章标题
Date: 2018-07-07
Category: 文章类别
Tag: 标签1, 标签2       #此处错误
 
正确方式
Tags: 标签1,标签2
 
《了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)

 

评论(0) 阅读(643)

基于gradle构建java应用程序

2018年6月30日 23:33

 
基于gradle构建java应用程序示例
 

目录

你需要什么
用户手册
初始项目
项目结构
编译项目
运行项目
总结
源码
 

你需要什么

  • 大约8分钟
  • 一个文本编辑器
  • 命令行终端
  • jdk1.7或更高版本
  • 最近版本的gradle

用户手册

gradle带有内置的init插件。它的文档地址
这个插件有一个task,名叫init,可以生成项目. init task使用内置的wrapper task生成wrapper脚本gradlew
 
运行init task
gradle init --type <name>
参数name可选值
  • java-application
  • java-library
  • scala-library
  • groovy-library
  • basic
这里我们选择java-application类型
 
首先创建项目目录
$ mkdir java-demo
$ cd java-demo
 

初始化项目

在项目目录中运行init task,并使用参数java-application
$ gradle init --type java-application
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :wrapper
> Task :init

BUILD SUCCESSFUL
 
init task先运行wrapper task生成gradlew、gradlew.bat脚本,并创建下面的项目结构
├── build.gradle
├── gradle            #wrapper的文件
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java        #源文件
    │       └── App.java
    └── test            #测试
        └── java
            └── AppTest.java
 
 

项目结构

settings.gradle有很多注释,有效行只有一行
settings.gradle
rootProject.name='java-demo'
配置root project的名称java-demo
 
生成的build.gradle同样有很多注释,下面是有效部分
build.gradle
apply plugin: 'java'
apply plugin: 'application'

repositories {
    jcenter()      #公有仓库
}

dependencies {
    compile 'com.google.guava:guava:21.0'   #google的guava包
    testCompile 'junit:junit:4.12'          #junit测试包
}

mainClassName = 'App'    #main类
build文件中加了java和application两个插件。前者支持java项目,后者允许指定包含main方法的类,在编译时执行
 
src/main/App.java
public class App {
    public String getGreeting() {
        return "Hello world.";
    }

    public static void main(String[] args) {   #在运行application插件的run task时调用
        System.out.println(new App().getGreeting());
    }
}
 
src/test/java/AppTest.java
import org.junit.Test;
import static org.junit.Assert.*;

public class AppTest {
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting",
            classUnderTest.getGreeting());
    }
}
 
编译项目
编译项目使用build命令。可以使用常用的gradle命令,但是使用wrapper脚本更好
$ ./gradlew build
> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes
> Task :jar
> Task :startScripts
> Task :distTar
> Task :distZip
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses

> Task :test

> Task :check
> Task :build

BUILD SUCCESSFUL
注意:第一次运行时会比较慢
 
第一次运行build时,会检查.gradle目录是否存在guava、junit包。如果不存在,则下载并存到本地目录
下次运行build就使用缓存。build task编译class文件,运行test用例,生成测试报告
 
查看html报告build/reports/tests/test/index.html.
样例
 

运行项目

gradle构建使用了application插件,所以能在命令行运行程序。
看看有哪些task
$ ./gradlew tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

// ... many other tasks ...
 
run task会让gradle读取mainClassName属性指定的类,执行main方法
$ ./gradlew run
:compileJava UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:run
Hello world.


BUILD SUCCESSFUL
 

总结

通过上面介绍可以学到
  • 如何生成java应用程序
  • 如何生成build文件、java文件
  • 如何运行构建、查看测试报告
  • 如何使用application插件的run task执行程序

源码

github地址
 
参考资料
 
了凡四训》详解之改过之法
印光大师十念法(胡小林主讲第1集)

 

Tags: gradle
评论(0) 阅读(659)

如何判断类是类

2018年6月29日 07:29

在写动态加载时,通常需要过滤出需要的类。如何从模块中过滤出其中的类呢?

  • 判断a是类A的实例
isinstance(a, A)
  • 判断B类是A的子类
issubclass(B, A)
  • 判断A是一个类
isinstance(A, type) 
  • 判断B是类并且是A的子类
isinstance(B, type) and issubclass(B, A)
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)
 

评论(0) 阅读(570)

TypeError: Unicode-objects must be encoded before hashing

2018年6月29日 07:16

python3中md5加密报错

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update("123")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

正确方式

unicode对象不能直接加密

md5.update("123".encode("utf-8"))
 
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)

 

Tags: python3
评论(1) 阅读(776)

pycharm回车符问题

2018年6月24日 07:31

pycharm如何防止windows回车符呢?
 
pycharm新建项目之后,默认不会对回车符有任何处理。键盘回车、粘贴都会产生windows回车符.
 
  • 解决办法
1.选中项目根节点
2.File-->Line Separators-->LF Unix
 
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)

 

Tags: pycharm
评论(0) 阅读(570)