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.pswp.cn/news/271155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271155.shtml
英文地址,請注明出處:http://en.pswp.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、輸出設計輸出設計主要包括:確定輸出內容、選擇輸出設備與介質、確定輸出格式三個方面的內容。確定輸出內容:輸出內容的設計首先要確定用戶在使用信息方面的需求,然后設計輸出信息的內容,包信息形式(括文字、圖形、表…