ITPub博客

首页 > IT基础架构 > 应用安全 > pymysql 非线程安全导致的故障.

pymysql 非线程安全导致的故障.

原创 应用安全 作者:babyyellow 时间:2020-04-07 09:17:05 0 删除 编辑

mysqldb   这个python 驱动只支持到 python 2 . 

转到python 3 后.   无法使用了.  
启用  pymysql 这个驱动. 
在投入生产后, 发现了一些问题. 
在使用较大规模的 for id  in  [list]:
   db.query (xxxxxxxxx)   
查询数据库的时候,  出现了一些比较奇怪的网络连接层面的报错. 
数据报 的 头字节 格式错误. 
如果只是执行单个查询则是不会报错. 
经过排查,  发现这是pymysql 的bug 或者缺陷. 
即 PYmysql 不是线程安全的.   由于我们自己的组件  dba模块. 
对数据库查询做了包装.  
导致 在某些情况情况下.   python 的代码优化模块. 
对代码的优化, 出现了并行的情况. 
即前一个sql 查询没有返回的情况下,  另一个线程启动了并从同一个数据库句柄读取数据. 
导致了 数据报的格式错误. 
改进方案: 
1.  对数据库的连接 增加线程锁.  
     每一次查询 都加锁.   在异常处理中也要同时加上解锁代码. 
2. 更换为mysql.com 提供的 官方的  mysql-connector-python  驱动.  目前没有发现问题. 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-2684692/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
oracle MySQL Postgresql 专职数据库dba。 系统架构师。 mysql 官方认知dba 。 15年专职dba 经验。

注册时间:2010-12-02

  • 博文量
    300
  • 访问量
    1580334