python 单例与数据库连接池 及相关选择
单例:专业用来处理连接多的问题(比如连接redis,zookeeper等),全局只有一个对象
单例代码
def singleton(cls): instances = {} def _singleton(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls] return _singleton
实例代码
from singleton import singleton #@singleton
class MysqlOpers: def __init__(self):
print('建立mysql连接')
#伪代码 self.db = MySQLdb.connect() def select(self):
pass m = MysqlOpers()
n = MysqlOpers()
c = MysqlOpers() print(id(m))
print(id(n))
print(id(c))
加上单例装饰器后
mysql 连接池
#coding=utf-8 import traceback import MySQLdb
from DBUtils.PooledDB import PooledDB db_pool_ins = None #需要替换用户名,密码等
class DBPool():
def __init__(self):
self.pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=10, maxconnections=100, blocking=True,
host= "127.0.0.1", port=3306, user='', passwd='',
db='test', charset='utf8',) def get_connection(self):
return self.pool.connection() class DBAction():
#连接池对象
def __init__(self):
#建立和数据库系统的连接
global db_pool_ins
if db_pool_ins == None:
db_pool_ins = DBPool()
self.conn = db_pool_ins.get_connection()
#获取操作游标
self.cursor = self.conn.cursor() def close_database(self):
self.cursor.close()
self.conn.close() def data_operate(self, sql, params=()):
'''
数据的插入,更新,删除
:param database:
:param sql:
:return: 成功:0,失败:1
'''
try:
self.cursor.execute(sql, params)
self.conn.commit()
return 0
except:
print("sql is %s, params is %s error. %s" % (sql, params, traceback.format_exc()))
self.conn.rollback()
raise Exception def data_operate_many(self, sql, params=()):
'''
数据的插入,更新,删除
:param sql:
:param params:
:return: 成功:0,失败:1
'''
#执行sql语句
self.cursor.executemany(sql, params)
#提交到数据库执行
self.conn.commit() def data_operate_count(self, sql, params=()):
'''
数据的插入,更新,删除
:return: 受影响的条数
'''
#执行sql语句
count = self.cursor.execute(sql, params)
#提交到数据库执行
self.conn.commit()
return count def data_inquiry(self, sql, size=10, params=()):
'''
:param database:
:param sql:
:return: ((),(),...,())
'''
self.cursor.execute(sql, params)
result = self.cursor.fetchmany(size)
return result def data_inquiry_all(self, sql, params=()):
'''
:param database:
:param sql:
:return: ((),(),...,())
'''
self.cursor.execute(sql, params)
result = self.cursor.fetchall() return result def commit(self):
self.conn.commit()
链接mysql等关系型数据库,应当采用此方式。确保多连接存在。
python 单例与数据库连接池 及相关选择的更多相关文章
- python单例与数据库连接池
单例:专业用来处理连接多的问题(比如连接redis,zookeeper等),全局只有一个对象 单例代码def singleton(cls): instances = {} def _singleton ...
- python单例(重点)
单例 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题的成熟的 ...
- Python——单例设计模式
单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...
- python 基础 9.5 数据库连接池
一. 数据库连接池 python 编程中可以使用MySQLdb 进行数据库的连接及诸如查询,插入,更新等操作,但是每次连接mysql 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- Python单例
01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...
- C3P0数据库连接池的相关bug解决
数据库连接池的几个常见bug: 1.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76c7022e -- ...
- 关于python单例的常用几种实现方法
这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到, 所以这里把之前用过的不同方式实现的单例方式整理一下 装饰器的方式 这种方式也是工作中经常用的一种 ...
- 性能超过DRUID的最强数据库连接池——HikariCP相关配置及简单示例
在配置application.yml时,对hikari的配置会有这样一个字段validationQuery. validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一 ...
- Python 单例
方法1: 1 class Singleton(object): def __new__(cls, *args, **kwargs): if '_inst' not in vars(cls): cls. ...
随机推荐
- 冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱
1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+)/2个数降序排序 ...
- (模板)poj2387(dijkstra+优先队列优化模板题)
题目链接:https://vjudge.net/problem/POJ-2387 题意:给n个点(<=1000),m条边(<=2000),求结点n到结点1的最短路. 思路:dijkstra ...
- SQLite进阶-15.触发器
目录 触发器(Trigger) 触发器(Trigger)的要点: 触发器应用 查看触发器 删除触发器 触发器(Trigger) 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时 ...
- work note
eclipse git 察看历史 左边是提交的 import { NgModule } from '@angular/core'; import { IonicPageModule } from 'i ...
- MySql设计表中的create_time和update_time字段
一般create_time和update_time字段的类型为datetime类型,长度为0
- 【转载】java8 自定义TemporalAdjuster
有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日.下个工作日,或者是本月的最后一天.这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdju ...
- EffectiveC++
宁可以编译器替换预处理器 define 不被视为语言的一部分,因此也就有可能在预处理阶段被优化掉,导致相关变量出现错误. #define ASPECT_RATIO 1.63 //可以尝试将其替换为 c ...
- Django-djangorestframework-异常模块-源码及自定义异常
目录 异常模块 为什么要自定义异常模块 常见的几种异常情况 异常模块源码分析 自定义 drf 异常处理 异常模块 为什么要自定义异常模块 所有经过 drf APIView 视图类产生的异常,都可以提供 ...
- 怎样获取所有style节点
通过 document.styleSheets 获取所有的样式表节点. document.styleSheets instanceof StyleSheetList; // true 注意: 1. 返 ...
- hdu 1087最长上升子序列和问题
看来大佬的dp思路,在这里就简单的总结下吧. 拿到一个问题,先得考虑是否适用dp算法. 1,找到最优解的结构,看其子问题是否也满足最优化(子问题最优化问题) 2, 看时候有子问题重叠 确定一个问题可 ...