在我工作的项目里面使用了mongodb.自然也用到了pymongo.但是它都是在大片的函数里面使用类似于这样的方式
代码如下 | 复制代码 |
import db def test(): ... db.test.find_one() ... |
但是问题是在使用完都没有关闭连接,这样多台服务器连接我这台mongodb服务器,在业务高峰期就会占满我的连接, 我当时总结造成这个原因的问题有以下三种:
上面说的用完db不关闭连接而是等着db超时
注意上面的import,其实在import文件的时候数据库连接就已经生成了,没有在需要的时候才创建, 占满我连接的应用其实有很多没有用,浪费了
nginx、uwsgi,celery等应用配置的问题,造成过多的实例,其实根本无益
我今天写的一个封装pymongo和关闭数据库连接的装饰器
代码如下 | 复制代码 |
#/usr/bin/env python # coding=utf-8 """ from functools import wraps try: class Mongo(object): '''封装数据库操作''' def __init__(self, host='localhost', port=27017, database='test', @property def __getitem__(self, collection): def __getattr__(self, collection_or_func): class Collection(object): def __init__(self, db, collection): def __getattr__(self, operation): def close_db(dbs=['db']): |
PS: 在我测试的时候发现,使用Mongo()类生成的db,操作完会自动关闭连接了…
怎么样给一个很大的文件每个函数都加上面的这个装饰器?
项目每个脚本的代码都很长,函数也很多,并且每个函数里面使用的db的名字都不同,比如有一些一些风格:
代码如下 | 复制代码 |
db.test.find_one() s_db.test.insert(dict(test='test')) ... |
每个函数加一个装饰器,好费劲,就想能不能自动分辨文件中的函数然后给他们自动加装饰器,然后就有以下的一个做好的脚本:
代码如下 | 复制代码 |
#coding=utf-8
from functools import wraps def wrap(func): def test(): def test2(): glocal_dict = copy.copy(globals()) func_list = [[k, v] for k, v in glocal_dict.iteritems() if not k.startswith('__')] for func_name, func in func_list: |
这样当你调用的时候自动就有了装饰器:
代码如下 | 复制代码 |
>>> from test import test >>> test() test wrap you >>> |