先来看查看效果:

在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的连接下来,重启mysql命令:

关于python代码:

  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3.  
  4. import pymysql
  5. import random
  6. import time
  7.  
  8. # 初始化mysql 连接池
  9. def MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect):
  10.  
  11. # 定义返回mysql连接池的类型,这里定义为 list
  12. return_db_list = []
  13.  
  14. for Connect in range(0,mysql_maxconnect):
  15. try:
  16. db = pymysql.connect(
  17. host = mysql_host ,
  18. port = mysql_port ,
  19. user = mysql_user ,
  20. passwd = mysql_password ,
  21. db = mysql_dbname ,
  22. charset = mysql_charset
  23. )
  24.  
  25. print ("连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
  26. return_db_list.append(db)
  27. except Exception as e:
  28. print ("连接MySQL数据库出错")
  29. print (e)
  30.  
  31. # 如果mysql连接池为空,则返回-1
  32. if 0 == len(return_db_list):
  33. print ("错误 , 连接MySQL数据库失败,连接池为0")
  34. return -1
  35.  
  36. else:
  37. # 返回mysql连接池
  38. return return_db_list
  39.  
  40. def Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname , MySQL_Connect_Pool , mysql_maxconnect) :
  41.  
  42. # 打印补充前的mysql连接数
  43. print ("补充前MySQL连接数为:",len(MySQL_Connect_Pool))
  44.  
  45. # 循环相差的连接数
  46. for Connect in range((len(MySQL_Connect_Pool)) , mysql_maxconnect):
  47. try:
  48. db = pymysql.connect(
  49. host = mysql_host ,
  50. port = mysql_port ,
  51. user = mysql_user ,
  52. passwd = mysql_password ,
  53. db = mysql_dbname ,
  54. charset = mysql_charset
  55. )
  56.  
  57. print ("重新补充,连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
  58. # 将刚刚连接成功的DB连接追加到MySQL_Connect_Pool中
  59. MySQL_Connect_Pool.append(db)
  60. except Exception as e:
  61. print ("重新补充,连接MySQL数据库出错")
  62. print (e)
  63.  
  64. if 0 == len(MySQL_Connect_Pool):
  65. print ("错误 , 连接MySQL数据库失败,连接池为0")
  66. return -1
  67.  
  68. else:
  69. # 打印连接池总数并且返回
  70. print("Mysql 连接池总数为:" , len(MySQL_Connect_Pool))
  71. return MySQL_Connect_Pool
  72.  
  73. def main() :
  74.  
  75. # 定义测试mysql信息
  76. mysql_host = "192.168.1.100"
  77. mysql_port = 3306
  78. mysql_user = "liwang"
  79. mysql_password = "liwang"
  80. mysql_charset = "utf8"
  81. mysql_dbname = "itchat"
  82. mysql_maxconnect = 3
  83.  
  84. # 初始化mysql连接池
  85. MySQL_Connect_Pool = MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect)
  86.  
  87. # 定义初始化sql
  88. sql = "show databases;"
  89.  
  90. while True:
  91. # 随机获连接池的下标
  92. db_link = random.randint(0,len(MySQL_Connect_Pool)-1)
  93. try:
  94. # 执行sql
  95. cursor = MySQL_Connect_Pool[db_link].cursor()
  96. cursor.execute(sql)
  97. print (cursor.fetchall())
  98. except Exception as e:
  99. # 如果执行失败,模拟为DB连接失效,则打印错误信息,删除错误的MySQL_Connect_Pool信息
  100. print (e)
  101. del MySQL_Connect_Pool[db_link]
  102. print ("数据库无法连接,删除Mysql连接池下标:" , db_link)
  103. # 重新补充mysql连接池
  104. Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,MySQL_Connect_Pool,mysql_maxconnect)
  105.  
  106. # 休眠10s
  107. time.sleep(10)
  108.  
  109. if __name__ == "__main__" :
  110. main()

利用python list 完成最简单的DB连接池的更多相关文章

  1. 用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

  2. Go语言之从0到1实现一个简单的Redis连接池

    Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识 ...

  3. 自定义一个简单的JDBC连接池

    一.什么是JDBC连接池? 在传统的JDBC连接中,每次获得一个Connection连接都需要加载通过一些繁杂的代码去获取,例如以下代码: public static Connection getCo ...

  4. 转 Swoole】用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

  5. Redis 简单使用 and 连接池(python)

    Redis 简介 NoSQL(not only sql):非关系型数据库 支持 key-value,  list,  set,  zset,  hash 等数据结构的存储:支持主从数据备份,集群:支持 ...

  6. python 基础 10.0 nosql 简介--redis 连接池及管道

    一. NOSQL 数据库简介 NoSQL 泛指非关系型的数据库.非关系型数据库与关系型数据库的差别 非关系型数据库的优势: 1.性能NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且 ...

  7. 自定义DB连接池实现

    实现一个简单的数据库连接池 1,连接池接口 package dbsource; import java.sql.Connection; import java.sql.SQLException; /* ...

  8. Redisclient连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

    工作须要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外仅仅提供一个接口. 2.屏蔽上层应用对连接的细节处理: 3.底层採用队列的方式保持连接池,保存连接会话. 4.重连时採用时间 ...

  9. 利用Python进行数据分析(1) 简单介绍

    一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,“数据”是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据.数据表等. 二.说说 ...

随机推荐

  1. 关于创建String对象过程的内存分配

    String是引用数据类型 但是String实际上java给我们提供的是一个类 注意:String 全类被fianl所修饰 所以 String 又叫 字符串常量 String 的值 一旦定义 不可以改 ...

  2. 利用linux curl爬取网站数据

    看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...

  3. HDFS中将普通用户增加到超级用户组supergroup

     

  4. ES6学习笔记(字符串和数值)

    (一)字符串的扩展 1.字符串的遍历 for (let codePoint of 'foo') { console.log(codePoint) } // "f" // " ...

  5. poj_3045 贪心

    Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the ...

  6. curl get方式

    提交数据到https时,需要pem证书来加密.我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密.但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证 ...

  7. git pre-push hook

    This article introduces git pre-push hook. Problem In Lean project, we use a modified version of Goo ...

  8. Dockerfile的常见命令

    FROM 格式: FROM  <image> 或者  FROM <image>:<tag> FROM指令的功能是为后面的指令提供基础镜像,所以该指令一定是Docke ...

  9. Winform导入文件

    winfrom的选中文件的路径放进文本框,我还是一个新手,欢迎大家在评论里面多多指教

  10. spring boot1.0 集成quartz 动态配置定时任务

    转载自 https://www.imooc.com/article/36278 一.Quartz简介了解 Quartz Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应 ...