先来看查看效果:

在代码连接数据库后,并且执行三条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. fair scheduler配置

    <property>    <name>yarn.resourcemanager.scheduler.class</name>    <value>or ...

  2. unique_ptr

    [unique_ptr] unique_ptr 不共享它的指针.它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法.只能移动unique ...

  3. android sdk更新后出现please update ADT to the latest version的解决方法

    参考:https://www.cnblogs.com/wicub/p/3613353.html 把 1.修改android-sdk-windows/tools/lib下的plugin.pro文件,用记 ...

  4. event.keyCode用法及列表

    HTML 用户名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(Use ...

  5. FPGA_VHDL 学习课堂笔记001

    FPGA_VHDL 学习课堂笔记   记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记. 代码语言:VHDL 编程软件:MAX+plus II FPGA硬件:FLE-843   03月05日 ...

  6. linux服务开机自动启动

    zookeeper设置开机自动启动 第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行,其中export JAVA_HOME=/usr/ ...

  7. 微信小程序日历面板插件

    创建日历面板组件,在components目录下创建calendar文件夹 1.calendar.js // components/calendar/calendar.js var util = req ...

  8. c# 判断当前版本是Debugger或Release

    1.第一种 (常用) #if DEBUG //debugger 环境 #else //release 环境 #endif 2. 第二种 private bool IsDebug() { Assembl ...

  9. GlusterFS

    1.      GlusterFS概述 GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处 ...

  10. 十四、new Comparator<T>实现多重排序结果

    1.编写实现类 package com.abcd; public class Person{ private String name; private int age; private int sal ...