首页 > 数据库 >mysql-connector-python驱动和django-mysql-pool连接池

mysql-connector-python驱动和django-mysql-pool连接池

时间:2023-03-20 14:07:12浏览次数:33  
标签:map 函数 get python connection django lst mysql 连接池

#####################

 

为了设计一个公用的、安全的连接池接口,可以考虑以下几个方面:

  1. 封装连接池初始化和获取连接的逻辑,使得调用者不需要了解连接池的具体实现细节,只需要调用接口获取连接即可。例如,可以在一个单独的 Python 模块中定义一个 ​​get_connection​​ 函数,用于获取数据库连接。
  2. 设计一个适合当前网站业务场景的连接池配置,包括最大连接数、最小空闲连接数、连接超时时间等参数。这些参数需要根据实际情况进行调整,以满足高性能、高并发和通用性等需求。
  3. 使用线程本地存储(Thread Local Storage)等技术,确保每个线程都使用自己的数据库连接,避免线程之间出现连接资源竞争的情况。
  4. 实现连接池的自动回收和重连机制,防止因为数据库连接异常或者数据库宕机等情况导致连接池中的连接不可用。
  5. 为连接池接口添加必要的异常处理逻辑,例如连接超时、连接池达到最大连接数、数据库连接异常等情况,需要有相应的异常处理机制,以防止应用程序因为连接池问题而崩溃。
  6. 在连接池接口中加入安全措施,例如连接池的连接需要进行身份验证、防止 SQL 注入等等。
  7. 最后,为连接池接口添加适当的日志和性能统计功能,方便对连接池的使用和性能进行监控和优化。

总之,设计一个公用的、安全的连接池接口需要综合考虑多方面的因素,需要根据具体的业务场景进行优化和调整。

 

 

import threading
import mysql.connector.pooling
from django.conf import settings

class LocalStorage(threading.local):
def __init__(self):
self.conn = None

class MySQLConnectionPool:
def __init__(self):
self.pool = mysql.connector.pooling.MySQLConnectionPool(
pool_name='mypool',
pool_size=settings.DATABASES['default']['OPTIONS']['pool']['max_connections'],
host=settings.DATABASES['default']['HOST'],
port=settings.DATABASES['default']['PORT'],
user=settings.DATABASES['default']['USER'],
password=settings.DATABASES['default']['PASSWORD'],
database=settings.DATABASES['default']['NAME'],
)

def get_connection(self):
local = threading.local()
if not hasattr(local, 'conn'):
local.conn = self.pool.get_connection()
return local.conn

pool = MySQLConnectionPool()

def get_connection():
return pool.get_connection()

 

这个优化做了以下几个改进:

  1. 把 ​​MySQLConnectionPool​​ 封装成了一个类,把 ​​get_connection​​ 方法封装到类里面,这样就更加规范化和模块化了。
  2. 把 ​​LocalStorage​​ 类封装到了 ​​MySQLConnectionPool​​ 类里面,因为 ​​LocalStorage​​ 只用于 ​​MySQLConnectionPool​​ 类中的 ​​get_connection​​ 方法,所以可以把它封装到 ​​MySQLConnectionPool​​ 类中,以便于维护和组织代码。
  3. 把 ​​local​​ 变量移动到了 ​​get_connection​​ 方法内部,这样可以避免多个线程之间的干扰,从而更加安全。
  4. ​get_connection​​​ 方法直接从 ​​MySQLConnectionPool​​ 类中获取连接池,避免了全局变量的使用,从而更加规范化和安全。

 

 

 

 

 

在 Python 中,函数的参数可以是一个函数,这个函数作为参数传递给其他函数时被称为回调函数(callback function)。回调函数可以让函数的功能更加灵活,能够适应各种不同的场景需求。

例如,在处理列表或数组的过程中,有时需要对列表或数组中的每个元素进行一些操作,例如对每个元素进行求和、求平均值、乘以某个常数等。

这时可以将对元素的操作封装成一个函数,并将这个函数作为参数传递给一个名为 ​​map()​​​ 的函数,​​map()​​ 函数就可以对列表或数组中的每个元素执行这个函数,将处理后的结果组成一个新的列表或数组返回。

下面是一个使用回调函数实现 ​​map()​​ 函数的示例代码:

def map(callback, lst):
result = []
for item in lst:
result.append(callback(item))
return result

def square(x):
return x * x

def cube(x):
return x * x * x

lst = [1, 2, 3, 4, 5]
print(map(square, lst)) # 输出 [1, 4, 9, 16, 25]
print(map(cube, lst)) # 输出 [1, 8, 27, 64, 125]

在这个例子中,​​map()​​​ 函数接受一个回调函数 ​​callback​​​ 和一个列表 ​​lst​​​,将 ​​lst​​​ 中的每个元素传递给 ​​callback​​​ 函数,并将结果存储在 ​​result​​​ 列表中,最后返回 ​​result​​​ 列表。​​square()​​​ 和 ​​cube()​​​ 函数都接受一个参数 ​​x​​​,分别将 ​​x​​ 的平方和立方返回。

当调用 ​​map(square, lst)​​​ 时,​​square()​​​ 函数被作为回调函数传递给 ​​map()​​​ 函数,所以 ​​map()​​​ 函数会对 ​​lst​​ 中的每个元素求平方,并返回一个新的列表 [1, 4, 9, 16, 25];

当调用 ​​map(cube, lst)​​​ 时,​​cube()​​​ 函数被作为回调函数传递给 ​​map()​​​ 函数,所以 ​​map()​​​ 函数会对 ​​lst​​ 中的每个元素求立方,并返回一个新的列表 [1, 8, 27, 64, 125]。

 

 

标签:map,函数,get,python,connection,django,lst,mysql,连接池
From: https://blog.51cto.com/u_13912516/6132706

相关文章

  • python实现一个二分法
    #################      ############################### ......
  • Linux下MySQL安装
    MySQL安装过程下载官方包wget-i-chttp://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm成功信息:FINISHED--2023-03-2009:40:49--Totalwall......
  • Docker compose Mysql 8 sql_mode 配置及修改only_full_group_by docker sql_mode 'N
    mysql默认的配置sql_mode包含ONLY_FULL_GROUP_BY,我们要去掉,网上找了好多帖子,大多数copy来copy去,说的乱七八糟,很无奈,最后折腾了半天才搞定,主要是注意2点1、先明白你的mysq......
  • python 文本形成视频
    https://modelscope.cn/models/damo/text-to-video-synthesis/summary?continueFlag=316e474d46439886c7d26c850c8c9d37frommodelscope.pipelinesimportpipelinefrom......
  • Python语言种有哪些关键字
    关键字是Python语言自己已经使用的,不允许开发者自己定义和关键字相同名字的标识符。FalseclassfromorNonecontinueglobalpassTruedef......
  • MySQL锁机制
        上文总结了MySQL的隔离级别,而隔离级别是通过锁机制实现的,所以针对锁机制展开详细描述。    首先介绍MySQL的锁可以分为:享/读/共享锁SharedLocks:针......
  • python+playwright 学习-35.获取页面的完整 HTML 内容
    前言selenium里面有个driver.page_source可以获取整个html页面的内容,playwright里面也有类似的方法使用page.content()page.content()获取html内容使用示例fromp......
  • MySql前缀索引解析
    一、什么是前缀索引所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前10位来建索引,这样建立起来的索引更小,查询效......
  • ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
    一、关于ShardingSphere 官网:​​ApacheShardingSphere​​官方文档:​​概览::ShardingSphere​​官方下载:​​Indexof/dist/shardingsphere​​本文使用版本:apache-sh......
  • django-rest-framework-从零开始-1-创建项目
    django-rest-framework-从零开始-1-创建项目1、下载模块python-mpipinstalldjangopython-mpipinstalldjangorestframework本次学习基于python3.9,python安装......