sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached错误解决思路

问题产生

flask程序使用sqlalchemy或flask-sqlalchemy运行一段时间后,会报该错误

sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/3o7r)

问题产生原因分析

造成这一问题的原因有很多,如高并发性等。

[En]

There are some reasons for this problem, such as high concurrency and so on.

还有一个典型的错误原因是,在客户端发送一个请求后, flask后台执行一个数据库操作,随后进行某种逻辑操作,如果该逻辑出现错误,会为客户端返回500错误码,此时该连接未释放,因此会导致数据库连接池继续占用。如下代码

@web.route(“/test_error”)def test_error(): print(“—————–error times “+ str(datatemp.error_counter)+”————“) datatemp.error_counter += 1 sites = Site.query.filter().all() r = requests.get(‘http://github.com’, timeout=0.001) return “error times “+ str(datatemp.error_counter)

requsts.get会必定报错,该逻辑之前 执行了查询操作,因此不会释放连接。

向/test_error连续发送20个请求,就会出现连接池错误。

解决方案1 增加连接池

该解决方案只适用于用户高并发导致的问题,对于本文描述的情况,该解决方案只能延迟问题,而不能解决问题。

[En]

The solution is only suitable for the problem caused by the high concurrency of users, and for the case described in this article, the solution can only delay the problem and cannot solve the problem.

解决方案2 增加try_except

在可能出错的语句,增加try字段

如上述代码可以修改为

@web.route(“/test_error”)def test_error(): print(“—————–error times “+ str(datatemp.error_counter)+”————“) datatemp.error_counter += 1 sites = Site.query.filter().all() try: r = requests.get(‘http://github.com’, timeout=0.001) except: r = None return “error times “+ str(datatemp.error_counter)

它可以解决本文描述的情况导致的连接池错误,但时间成本太长,特别是在项目规模较大的情况下。

[En]

It can solve the connection pool errors caused by the situation described in this article, but the time cost is too long, especially when the scale of the project is large.

解决方案3 使用redis

这个解决思路来源于Stack Overflow,本人尚未验证,

从理论上讲,它是可行的,可以解决高并发性、这个问题中提到的问题等。

[En]

In theory, it is feasible and can solve the high concurrency, the problems mentioned in this question, etc.

Original: https://blog.csdn.net/byna11sina11/article/details/120343803Author: byna11sina11Title: sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached错误解决思路

相关阅读Title: 即刻掌握python格式化输出的三种方式 (o゜▽゜)o☆

目录

1. f 转化的格式化输出方式

2. % 格式化输出的方法

3. format 格式化输出的方法

1. f 转化的格式化输出方式

只需要在我们要格式化输出的内容开头引号的前面加上 f ,在字符串内要转义的内容用 {} 括起来即可

模板 : print(f’xxx{aa}xxx’)

a = ‘apple’price = 12.4print(f’这里有{a}’)>>>这里有appleprint(f’价值{price}’)>>>价值12.4

2. % 格式化输出的方法

同样,我们将转义要输出的字符串中的内容。根据它的数据类型和应用,我们可以用以下符号替换它,并添加我们想要从字符串中传出的内容。

[En]

By the same token, we will escape the content in the string we want to output. According to its data type and application, we can replace it with the following symbol and add the content we want to transfer out of the string.

模板:print(‘xxx%sxxx’ % a)

python字符串格式化常用符号 %c格式化字符及其ASCII码 %s格式化字符串 %d格式化整数 %o格式化八进制数(不能带小数点) %x格式化十六进制数(不能带小数点) %f格式化浮点数,可以控制保留小数点后几位数 %e将数字转化成科学计数法的形式

a = ‘apple’price = 12print(‘输出:%c’ % 33) #将我们输入的数字按照ASCII码转换成对应的字符 33 对应的是!>>>输出:!print(‘输出:%s’ % a) # 转义输出字符串类型的数据>>>输出:appleprint(‘输出:%d’ % price) # 将数字类型的数据类型转义输出整数>>>输出:12print(‘输出:%e’ % 12) #将数字转化成科学计数法的形式>>>输出:1.200000e+01print(‘输出:%o’ % price) #将整数转化成八进制数据>>>输出:14print(‘输出:%x’ % price) #将整数转化成十六进制数据>>>输出:cprint(‘输出:%f’ % price) #格式化浮点数,默认保留小数点后六位>>>输出:12.000000

常用的格式化辅助符号 .用来改变小数点后面保留小数的位数 (用于%f)*定义宽度和小数点的精度-用于是数据做对齐+用于显示数据的正负号

print(‘输出:%.2f’ % 3.52311) #点后面跟上保留小数的位数>>>输出:3.52print(‘输出:%23s’%’你好’) # 小数点前面加数字用于表示输出的结果向右平移几个空格>>>输出: 你好print(‘输出:%+d’ % 12) #用于在输出数字结果前面加上正负号>>>输出:+12print(“输出:%*.*f” % (10,3,12.3432)) #用*代替字符串中的变量,方便修改输出时的格式要求>>>输出: 12.343

3. str.format() 格式化输出的方法

在我们要输出的字符串内将要转义内容,用 {} 代替,然后用 .format() 方法在括号里面传递我们想要输出的内容即可

模板 : print(‘xxx{}xxx’.format(x,x))

{} 中常用方法 模板 输出结果 {:a

将我们的数据类型转换为浮点数据(默认为6位小数)

[En]

Convert our data type to floating-point data (6 decimal places by default)

{:.a}

功能型可以搭配样式型来使用,样式型也可以搭配样式型来使用print(‘输出:{:&>8}’.format(‘牛牛’))>>>输出:&&&&&&牛牛print(‘输出:{:f}’.format(12))>>>输出:12.000000print(‘输出:{:.2f}’.format(12))>>>输出:12.00print(‘输出:{:+}’.format(12))>>>输出:+12print(‘输出:{:%}’.format(0.5))>>>输出:50.000000%print(‘输出:{:.2%}’.format(0.5))>>>输出:50.00%print(‘输出:{:e}’.format(0.5))>>>输出:5.000000e-01print(‘输出:{:b}’.format(5))>>>输出:101

总结 😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀

[En]

😀

%方法和format方法有相同的地方也有不同的地方,大家可以通过对比这来理解

虽然在我完成我的通俗归纳之后,可能仍然会有一些学生不太理解,但你可以试着效仿我几次,这样更容易掌握。

[En]

Although there may still be some students who don’t quite understand after I finish my popular induction, you can try to follow my example a few times to make it easier to master.

Original: https://blog.csdn.net/weixin_68418329/article/details/124907430Author: 波波涛Title: 即刻掌握python格式化输出的三种方式 (o゜▽゜)o☆

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/301450/

转载文章受原作者版权保护。转载请注明原作者出处!


比丘资源网 » sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached错误解决思路

发表回复

提供最优质的资源集合

立即查看 了解详情