首页 > 编程语言 >在Python中使用连接池

在Python中使用连接池

时间:2024-10-22 10:19:56浏览次数:7  
标签:Python 数据库 db connections 连接池 使用 连接 conn

在数据库操作中,频繁地打开和关闭连接会消耗大量的资源和时间,在一些需要高并发的场景,我们就需要连接池技术优化这一问题。本文以 Python 中的 SQLite 数据库为例,介绍如何使用连接池来提升数据操作的效率。


对于使用 SQLite 这样的轻量级数据库,虽然连接的开销相对较小,但在高并发或要求快速响应的应用场景中,优化连接过程仍然非常重要。

import sqlite3

# Connect to database ( 这里会很耗时 )
conn = sqlite3.connect('mydatabase.db')

# Create a cursor object
cursor = conn.cursor()

# Create a table (if it doesn't exist)
cursor.execute('''sql statement''')

首先,我们来理解一下什么是连接池。在数据库操作中,每次访问数据库都需要和数据库服务器建立一个连接(conn = sqlite3.connect('mydatabase.db')),这个过程包括创建连接对象、与数据库建立通信、验证等多个步骤。连接池,顾名思义,就是预创建并存储一系列连接对象,当程序需要与数据库交互时,直接从池中取用,用完了再放回池中,避免了频繁创建和销毁连接的开销。


使用数据库连接池的步骤:

1.安装必要的 Python 库

首先确保已经安装了 sqlite3 模块,虽然 SQLite 在 Python 标准库中自带了 sqlite3 接口,但是没有实现连接池的功能,为此我们需要自行编写连接池,或使用第三方库,例如 sqlalchemy. 通过 pip 可以轻松安装 :

pip install sqlalchemy

接下来分别介绍这两种方法。


2.自行编写连接池

自行编写连接池,可以更好的理解连接池到底做了什么。

import sqlite3
from queue import Queue

class SQLiteConnectionPool:
    """
    SQLite 连接池类,用于管理数据库连接,避免频繁创建和关闭连接的开销。
    """
    def __init__(self, db_path, max_connections=10):
        """
        初始化连接池。

        Args:
            db_path (str): 数据库文件路径。
            max_connections (int): 连接池允许的最大连接数,默认为 10。
        """
        self.db_path = db_path  # 数据库文件路径
        self.max_connections = max_connections  # 最大连接数
        self.free_connections = Queue(maxsize=max_connections)  # 存储空闲连接的队列

    def get_connection(self):
        """
        从连接池获取一个数据库连接。

        Returns:
            sqlite3.Connection: 一个 SQLite 数据库连接对象。
        """
        if self.free_connections.empty():  # 如果队列为空,则创建新的连接
            conn = sqlite3.connect(self.db_path)
        else:  # 否则从队列中获取一个空闲连接
            conn = self.free_connections.get()
        return conn

    def put_connection(self, conn):
        """
        将一个数据库连接放回连接池。

        Args:
            conn (sqlite3.Connection): 要放回的数据库连接对象。
        """
        self.free_connections.put(conn)  # 将连接放回队列

代码解释 :

SQLiteConnectionPool 类 : 定义了连接池类,用于管理数据库连接。

构造函数 : 接收 db_path ( 数据库文件路径 ) 和 max_connections ( 最大连接数 ) 参数。创建了一个 Queue 对象来存储空闲连接,最大容量为 max_connections。

get_connection() 方法 :尝试从 free_connections 队列获取一个空闲连接。如果队列为空,则创建一个新的连接。返回获取到的连接。

put_connection() 方法 :将用完的连接放回 free_connections 队列,以便后续复用。

该连接池的使用方法:

pool = SQLiteConnectionPool('yoursqlite.db')

def concurrent_access(pool):
    conn = pool.get_connection()
    cur = conn.cursor()
    # 参数化查询
    cur.execute("sql")
    rows = cur.fetchall()
    pool.put_connection(conn)
    return rows

函数 concurrent_access 可以在高频场景下调用,本质上,连接池相当于一个全局变量。


3.使用 sqlalchemy 创建连接池

使用 sqlalchemy 的 create_engine 函数,我们可以创建一个 SQLite 连接池。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///my_database.db', pool_size=10)

使用方法也比较简单 :

from sqlalchemy import create_engine,text
engine = create_engine('sqlite:///my_database.db', pool_size=10)

def concurrent_access():
    with engine.connect() as conn:
        result = conn.execute(text("select * from reply"))
        for row in result:
            print(row)

函数 concurrent_access 可以在高频场景下调用,with 语句会自动处理连接的回收事宜。相当于以下代码:

conn = engine.connect()
# 数据库操作 ...
conn.close()

conn.close() 关闭连接,实际上这是将连接放回连接池中。


4.连接池的进阶使用

sqlalchemy 也支持许多高级功能,例如事务管理、ORM 模型等,这些可以帮助你更好地管理数据库操作。

标签:Python,数据库,db,connections,连接池,使用,连接,conn
From: https://blog.csdn.net/WANGWUSAN66/article/details/143107020

相关文章

  • 这些Python代码加速工具,你都用过吗?
    优化代码的工具会让代码变得更简洁,或者更迅速!一起来了解了解吧。NumPy、SciPy、Sage和Pandas先说NumPy,它的核心是一个多维数字数组的实现。除了这个数据结构之外,还实现了若干个函数和运算符,可以高效地进行数组运算。并且对于被调用的次数进行了精简。它可以被用来进行极......
  • Python语法探索:解锁编程艺术的大门
    Python,一种被广泛赞誉为“优雅”、“明确”及“简单”的高级编程语言,自1991年由GuidovanRossum创造以来,已经从一门小众脚本语言成长为全球范围内应用于网页开发、数据分析、人工智能等多个领域的强大工具。本文旨在为初学者和进阶开发者提供一份详尽的Python语法指南,通过实例解......
  • 分包基础概念+使用分包
     ......
  • DNARY.MDB 是一个数据库文件,通常使用 Microsoft Access 或其他兼容的数据库管理系统来
    DNARY.MDB是一个数据库文件,通常使用MicrosoftAccess或其他兼容的数据库管理系统来创建和管理。以下是一些关于.MDB文件格式的详细信息,以及它可能的用途和特性:什么是 .MDB 文件?文件扩展名:.MDB 是MicrosoftAccess数据库文件的扩展名,代表"MicrosoftDatabase"。数据......
  • 利用 Python 进行地理空间数据处理的工具
    本文将介绍九个常用的地理空间数据处理工具,包括GeoPandas、Fiona、Rasterio、Shapely、Pyproj、Descartes、Rtree、Geopy和Folium。这些工具覆盖了从地理空间数据读写、几何操作、坐标转换到地图绘制等多个方面,是地理信息系统(GIS)领域不可或缺的技术栈。1.GeoPandas:地理数据......
  • 高可用之限流 09-guava RateLimiter 入门使用简介 & 源码分析
    限流系列开源组件rate-limit:限流高可用之限流-01-入门介绍高可用之限流-02-如何设计限流框架高可用之限流-03-Semaphore信号量做限流高可用之限流-04-fixedwindow固定窗口高可用之限流-05-slidewindow滑动窗口高可用之限流-06-slidewindow滑动窗口sentinel源码......
  • 使用rem更好的去适配页面元素
    需要一段JS:(function(doc){letdocEl=doc.documentElement;// 获取根节点的htmldoc.addEventListener("DOMContentLoaded",recalc);functionrecalc(){letwidth=docEl.clientWidth;docEl.style.fontSize......
  • 11种经典时间序列预测方法:理论、Python实现与应用
    时间序列分析和预测在现代数据科学中扮演着关键角色,广泛应用于金融、经济、气象学和工程等领域。本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。这些方法包括:自回归(AR)移动平均(MA)自回归移动平均(ARMA)自回归积分移动平均(ARIMA)季节性自回归积分......
  • 2024常用 gui [转] Java Python C++ C# JavaScript Go Dart Swift
    下面就介绍一下热门编程语言对应的gui框架。JavaSwing:Java的基础GUI工具包,虽然年代较久,但仍然被广泛使用。JavaFX:现代的JavaGUI工具包,用于替代Swing,提供了更丰富的界面设计和动画效果支持。ApachePivot:一个开源的富互联网应用(RIA)框架,使用Java和XML来构建桌面和Web应用程序的......
  • OpenCV-Python 颜色空间转换
    一、颜色空间转换importcv2importnumpyasnpimg=cv2.imread('lena.jpg')#转换成灰度图img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('img',img)cv2.imshow('gray',img_gray)cv2.waitKey(0)颜色转换其实是数学运算,如灰度化最常用的是:gray......