python循环顶帖_设计Python数据库连接池1-对象的循环引用问题

在Python中如果对象定义了__del__方法的话,在对象的引用记数为0时会自动调用__del__方法(很象c++中的析构函数),但如果A对象引用B对象,B对象又引用A对象,就形成循环引用,此时A,B对象引用次数都为1。python就无法正常调用__del__方法,原计划在__del__方法里释放的资源自然也就无法释放。

一个连接池拥有多个连接,而每个连接又拥有这个连接池的实例(一个叫pool的属性)。这样就产生了刚刚说的哪个问题。我想到的办法就是在每次从池中获取连接的时候将连接的pool设置为当前实例,然后在归还这个连接的时候再将其设置为None,并且要在这个连接对象的__del__方法中将pool属性设置为None。具体看代码吧。(目前只实现了SQLite3的)

'''

Created on 2009-4-17

@author: phyeas

'''

import time

from queue import Queue

class PoolException(Exception):

pass

class Pool(object):

'''一个数据库连接池'''

def __init__(self, maxActive=5, maxWait=None, init_size=0, db_type="SQLite3", **config):

self.__freeConns = Queue(maxActive)

self.maxWait = maxWait

self.db_type = db_type

self.config = config

if init_size > maxActive:

init_size = maxActive

for i in range(init_size):

self.free(self._create_conn())

def __del__(self):

print("__del__ Pool..")

self.release()

def release(self):

'''释放资源,关闭池中的所有连接'''

print("release Pool..")

while self.__freeConns and not self.__freeConns.empty():

con = self.get()

con.release()

self.__freeConns = None

def _create_conn(self):

'''创建连接 '''

if self.db_type in dbcs:

return dbcs[self.db_type](**self.config);

def get(self, timeout=None):

'''获取一个连接

@param timeout:超时时间

'''

if timeout is None:

timeout = self.maxWait

conn = None

if self.__freeConns.empty():#如果容器是空的,直接创建一个连接

conn = self._create_conn()

else:

conn = self.__freeConns.get(timeout=timeout)

conn.pool = self

return conn

def free(self, conn):

'''将一个连接放回池中

@param conn: 连接对象

'''

conn.pool = None

if(self.__freeConns.full()):#如果当前连接池已满,直接关闭连接

conn.release()

return

self.__freeConns.put_nowait(conn)

from abc import ABCMeta, abstractmethod

class PoolingConnection(object, metaclass=ABCMeta):

def __init__(self, **config):

self.conn = None

self.config = config

self.pool = None

def __del__(self):

self.release()

def __enter__(self):

pass

def __exit__(self, exc_type, exc_value, traceback):

self.close()

def release(self):

print("release PoolingConnection..")

if(self.conn is not None):

self.conn.close()

self.conn = None

self.pool = None

def close(self):

if self.pool is None:

raise PoolException("连接已关闭")

self.pool.free(self)

def __getattr__(self, val):

if self.conn is None and self.pool is not None:

self.conn = self._create_conn(**self.config)

if self.conn is None:

raise PoolException("无法创建数据库连接 或连接已关闭")

return getattr(self.conn, val)

@abstractmethod

def _create_conn(self, **config):

pass

class SQLit3PoolConnection(PoolingConnection):

def _create_conn(self, **config):

import sqlite3

return sqlite3.connect(**config)

dbcs = {"SQLite3":SQLit3PoolConnection}

pool = Pool(database="F:\\test\\a")

def test():

conn = pool.get()

with conn:

for a in conn.execute("SELECT * FROM A"):

print(a)

if __name__ == "__main__":

test()

以上代码在python3.0中测试通过……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译时类型 和运行时类型的 区别(1)

class T{ void f(int x){ System.out.println("int in T:" x); } void f(double x){ System.out.println("double in T:"x); } void f(Object x){ System.out.println("Object in T:" x); }} class S extends T{ void f(int x){  //子类覆盖基…

系统开发基础:UML中图的相关知识笔记(下)

1、状态图状态图展现了一个状态机,它由状态、转换、事件、活动组成。状态图关注系统的动态视图,它对于接口、类、协作的行为建模尤为重要,它强调对象行为的事件顺序。组成:简单状态、组合状态、转换(事件和动作&#x…

java京东左侧固定层_京东首页右侧固定层

需求说明制作京东首页右侧的固定层,6个图标:京东会员、购物车、我的关注、我的足迹、我的消息和咨询JIMI默认状态下仅显示图标,背景颜色为深灰色;当鼠标移至图标上时,背景颜色为深红色,并且显示文本css*{ma…

云开发技术应用python_云开发技术应用(Python)

本书共14章,从Python语言的语法特性开始,介绍了Python的安装和配置、数据类型及表达式、流程控制、序列和字典、文件处理、函数等,由浅入深,循序渐进,逐步引入高级话题,包括面向对象编程、模块和包、异常处…

记录下Linux难记实用的命令

1 看文件大小:du -sm * | sort -n 2 合并多个文件,可以跨文件夹合并:cat *_.txt >> news.txt 3 给文件改编码:iconv -f GBK -t UTF-8 原文件名 -o 新文件名 4 查找文件内容:grep "thermcontact" */*.i…

系统设计基础:系统设计基本任务相关知识

1、系统设计的目的提前为系统指定蓝图,在各种技术和实施方法中进行权衡,精心设计,合理利用各种资源、最终确定新系统的详细设计方案。2、系统设计的内容系统设计的内容主要包括系统总体结构设计、代码设计、输出设计、输入设计、处理过程设计…

java7 3dm下载_3DM游戏运行库合集安装包v2.8

游戏运行库大全 游戏运行环境 所有游戏组件 32位 64位系统常用运行库合集 3DM游戏常用运行库安装包 下载 幸姨作品本安装包集成32位和64位运行库,是目前互联网上最新最全的常用运行库合集,能自动识别系统版本以提供适合您的组件,无人值守自动…

uci数据集_干货收藏!三大领域常用十大开源数据集

全文共1144字,预计学习时长2分钟机器学习的研究与实现离不开大数据。知晓通用的开源数据集,一方面可以验证自己算法,另一方面也可以与其他算法进行比较。本文介绍了计算机视觉、自然语言处理和语音识别三大领域的十个开源数据集以供你参考&am…

系统设计知识:系统设计的基本原理介绍

1、抽象抽象主要用来将复杂的现象简化到可以分析、实验或者可以理解的程度。抽象的最低层就是实现该软件的源程序代码。在进行模块化设计也可以有多个抽象层次,最高抽象层次的模块用概括的方式描述问题的解决方案。较低层次的模块是对更高抽象层次模块对问题描述的细…

Wpf Binding.Path设置

Binding.Path 获取或设置绑定源属性的路径。 每个绑定通常都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用的绑定源值的路径。有关这些数据绑定概念的更多信息,请参见数据绑定概述。 使用 Path 属性可以指定您要绑定到的源值&…

java内存溢出怎样查找代码_JVM - 内存溢出,问题查找

当内存溢出会抛出 java.lang.OutOfMemoryError: Java heap space 的异常,那这个时候怎样去分析到底哪里导致内存溢出呢?我们可以通过在vm的参数, -XX:HeapDumpOnOutOfMemoryError 记住这个理是大写XX。当内存溢出后,显示java.lang…

系统设计知识:系统模块结构设计知识笔记

1、什么是模块?模块可以认为是组成系统的基本单位,它具有可组合、分解、更换的特点。系统中任何一个处理功能都能看成是一个模块。模块根据具体化的程度可划分为逻辑模块和物理模块。模块的要素:输入输出:模块的输入来源和去向都是…

安卓扫一扫自动跳转软件_ipad软件使用技巧

适用于三款ipadipad pro 1ipad pro2ipad 2018三个ipad软件分别是notability、goodnotes、和MarginNote,这三个软件各有特点。其中notability、goodnotes是笔记软件,同样都可以自己创立笔记本配合苹果笔像手写一样做笔记,也可以导入pdf作为阅读…

第12章 使用Samba或NFS实现文件共享

章节简述: 本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法。 详细逐条讲解Samba服务配置参数,演示安全共享文件的配置策方法,并使用autofs服务程序自动挂载设备, 学会后即可实现Linux…

ExtClassLoader和AppClassLoader是Launcher类的两个内部类

sun.misc.Launcher他是一个java虚拟机的入口应用 看下Launcher类 ExtClassLoader和AppClassLoader是Launcher类的两个内部类

Java后端带参跨域访问_java后端解决请求跨域

跨域跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨…

系统输入输入出设计相关知识介绍

1、输出设计输出设计主要包括:确定输出内容、选择输出设备与介质、确定输出格式三个方面的内容。确定输出内容:输出内容的设计首先要确定用户在使用信息方面的需求,然后设计输出信息的内容,包信息形式(括文字、图形、表…