先来看查看效果:

在代码连接数据库后,并且执行三条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. Day08 - Ruby比一比:String的+=与concat串接

    前情提要: 在第七天我们透过比较Symbol和String,发现字串比符号多了更多方法!为了活用string method,今天我们接续前文,来探讨一题跟字串有关的题目: Ruby经典面试题目#08( ...

  2. react组件开发规范总结

    开发react也有一段时间了,一开始的随手写,生命周期乱用,无状态组件的不熟悉.现在逐渐规范一下,从网上各个地方copy过来,整理出一份文档.可能不全,后续还得多提炼总结和完善. 一.组件内方法书写, ...

  3. python中configparser模块记录

    python中用来读取配置文件,配置文件的格式相同于windows下的ini配置文件 一.常用函数 read(filename) #读取配置文件,直接读取ini文件内容 sections() #获取i ...

  4. 上位机与三菱FX3U通过FX-232-BD通信

    PLC侧设置: 和校验+协议4 读D200单字: 05 30 30 46 46 57 52 30 44 30 32 30 30 30 31     返回“201”:02 30 30 46 46 30 ...

  5. springBoot 全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler

    前言 本文讲解使用 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,可以处理大部分开发中用到的自自定义业务异常处理了,再也不用 ...

  6. PhoenixFD插件流体模拟——UI布局【Dynamics】详解

    流体动力学 本文主要讲解Dynamics折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Dynamics 主要内容 Ov ...

  7. Spring:AOP

    摘要 本文内容为我在网上搜集Spring AOP资料的汇总.摘抄. AOP是一种编程思想,其对不同对象进行了横向的抽象,将不同对象的.和主流程无关的公共逻辑抽象出来以方便维护.AOP的实现基础为AOP ...

  8. Golang学习---常用库

    1. 路由库:github.com/julienschmidt/httprouter 2. mysql驱动:github.com/go-sql-driver/mysql

  9. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  10. c/c++一维数组简单介绍

    定义:同一种类型数据的集合 通俗的讲就是,将多个同一种类型的数据按一定的内存顺序写在一起. 注意我的几个关键字“多个”,“同一种”,“一定的内存顺序”.如果理解了这几个关键词,说明你的数组已经掌握了. ...