先来看查看效果:

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

关于python代码:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import pymysql
import random
import time

# 初始化mysql 连接池
def MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect):

    # 定义返回mysql连接池的类型,这里定义为 list
    return_db_list = []

    for Connect in range(0,mysql_maxconnect):
        try:
            db = pymysql.connect(
                host = mysql_host ,
                port = mysql_port ,
                user = mysql_user ,
                passwd = mysql_password ,
                db = mysql_dbname ,
                charset = mysql_charset
            )

            print ("连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
            return_db_list.append(db)
        except Exception as e:
            print ("连接MySQL数据库出错")
            print (e)

    # 如果mysql连接池为空,则返回-1
    if 0 == len(return_db_list):
        print ("错误 , 连接MySQL数据库失败,连接池为0")
        return -1

    else:
        # 返回mysql连接池
        return return_db_list

def Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname , MySQL_Connect_Pool , mysql_maxconnect) :

    # 打印补充前的mysql连接数
    print ("补充前MySQL连接数为:",len(MySQL_Connect_Pool))

    # 循环相差的连接数
    for Connect in range((len(MySQL_Connect_Pool)) , mysql_maxconnect):
        try:
            db = pymysql.connect(
                host = mysql_host ,
                port = mysql_port ,
                user = mysql_user ,
                passwd = mysql_password ,
                db = mysql_dbname ,
                charset = mysql_charset
            )

            print ("重新补充,连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
            # 将刚刚连接成功的DB连接追加到MySQL_Connect_Pool中
            MySQL_Connect_Pool.append(db)
        except Exception as e:
            print ("重新补充,连接MySQL数据库出错")
            print (e)

    if 0 == len(MySQL_Connect_Pool):
        print ("错误 , 连接MySQL数据库失败,连接池为0")
        return -1

    else:
        # 打印连接池总数并且返回
        print("Mysql 连接池总数为:" , len(MySQL_Connect_Pool))
        return MySQL_Connect_Pool 

def main() :

    # 定义测试mysql信息
    mysql_host = "192.168.1.100"
    mysql_port = 3306
    mysql_user = "liwang"
    mysql_password = "liwang"
    mysql_charset = "utf8"
    mysql_dbname = "itchat"
    mysql_maxconnect = 3

    # 初始化mysql连接池
    MySQL_Connect_Pool = MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect)

    # 定义初始化sql
    sql = "show databases;"

    while True:
        # 随机获连接池的下标
        db_link = random.randint(0,len(MySQL_Connect_Pool)-1)
        try:
            # 执行sql
            cursor = MySQL_Connect_Pool[db_link].cursor()
            cursor.execute(sql)
            print (cursor.fetchall())
        except Exception as e:
            # 如果执行失败,模拟为DB连接失效,则打印错误信息,删除错误的MySQL_Connect_Pool信息
            print (e)
            del MySQL_Connect_Pool[db_link]
            print ("数据库无法连接,删除Mysql连接池下标:" , db_link)
            # 重新补充mysql连接池
            Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,MySQL_Connect_Pool,mysql_maxconnect)

        # 休眠10s
        time.sleep(10)

if __name__ == "__main__" :
    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. linux上部署jenkins步骤小记

    一.部署jdk环境 1.下载jdk包,解压,放在选定的位置,我本次jdk包放置在“/usr/local/java/jdk” 目录下 2.配置环境变量 1)打开/etc/profile文件,在命令框中输 ...

  2. linux 下oracle导入dmp文件

    2017年08月01日 19:10:49 xuxie13 阅读数:17788   最近要到某公司进行poc演示,整了个新项目,需要我数据库修改项目,这才有了这篇博客. 首先进入linux下oracle ...

  3. 管理多个gradle,SDKMAN

    背景:同一台机器上有两个app需要编译,但是两个app的gradle版本不一致,所以需要安装一个管理gradle版本的工具   sdkman:(Software Development Kit Man ...

  4. python--第十九天总结(Django)

    1.静态资源导入 {#在顶部load 一个staticfiles#} {% load staticfiles %} {#在底部使用#} <script src='{% static " ...

  5. 搞搞电脑微信表情的破解(.dat转png or jpg)

    首先感谢:https://blog.csdn.net/weixin_42440768/ 因为狗子喜欢之前那个头像,但是没找到,于是我想看看我们之前的斗图过程中有没有发她的头像. 这是做这件事情的起因. ...

  6. sublime安装PackageControl提示失败(被墙了)

    An error occurred installing Package Control 然后下面又说visit....某网址 如果弹出这个错误的话,就是被墙了.翻个墙或者改hosts就行了 如果是改 ...

  7. python环境搭建(linux)

    python安装 # wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz # yum install openssl-devel ...

  8. Spring--基础介绍一:IOC和DI

    前面学习了Struts2和Hibernate. Struts2主要是用来控制业务层面逻辑和显示,告诉你什么时候走哪个action,跑去运行哪个class的什么方法,后面调到哪个jsp. Struts2 ...

  9. spring mvc 500错误Allocate exception for servlet AppService javax.naming.NamingException: Cannot create resource instance 竟是@Resource的原因

    头几天已经测试的完毕了,换了个目录出现这个问题 严重: Allocate exception for servlet AppService javax.naming.NamingException: ...

  10. SQL CTE递归

    WITH cte_name AS ( --Anchor member is defined ' UNION ALL --Recursive member is defined referencing ...