数据库连接池,主要用于多线程,为了防止多线程同时对数据库进行操作出现混乱。创建数据库线程池,维护n个数据库连接供程序使用

    1. import threading
    2. import pymysql
    3. from DBUtils.PooledDB import PooledDB
    4. class SqlHelper(object):
    5. def __init__(self):
    6. self.pool = PooledDB(
    7. # 数据库驱动模块
    8. creator=pymysql,
    9. # 线程池最大连接数
    10. maxconnections=6,
    11. # 初始化连接池时创建的连接数
    12. mincached=2,
    13. # 池中空闲连接的最大数量
    14. maxcached=5,
    15. # 池中共享连接的最大数量
    16. maxshared=3,
    17. #默认False,即达到最大连接数时,再取新连接将会报错,True,达到最大连接数时,新连接阻塞,等待连接数减少再连接
    18. blocking=True,
    19. # 连接的最大使用次数
    20. maxusage=None,
    21. # 确定何时使用ping()检查连接。默认1,即当连接被取走,做一次ping操作。0是从不ping,1是默认,2是当该连接创建游标时ping,4是执行sql语句时ping,7是总是ping
    22. ping=0,
    23. host='127.0.0.1',
    24. port=3306,
    25. user='blogadmin',
    26. password='blogpwd',
    27. database='flask_blog',
    28. charset='utf8',
    29. )
    30. self.local = threading.local()
    31. # 打开连接
    32. def open(self):
    33. conn = self.pool.connection()
    34. cursor = conn.cursor()
    35. return conn, cursor
    36. # 关闭连接
    37. def close(self, cursor, conn):
    38. cursor.close()
    39. conn.close()
    40. # 查询全部
    41. def fetchall(self, sql, *args):
    42. conn, cursor = self.open()
    43. cursor.execute(sql, *args)
    44. result = cursor.fetchall()
    45. self.close(cursor, conn)
    46. return result
    47. # 查询一条
    48. def fetchone(self, sql, *args):
    49. conn, cursor = self.open()
    50. cursor.execute(sql, *args)
    51. result = cursor.fetchone()
    52. self.close(cursor, conn)
    53. return result
    54. # 插入一条
    55. def insert(self, sql, *args):
    56. conn, cursor = self.open()
    57. try:
    58. cursor.execute(sql, *args)
    59. # 食物提交
    60. conn.commit()
    61. self.close(cursor, conn)
    62. return True
    63. except:
    64. # 事务回滚
    65. conn.rollback()
    66. return False
    67. def __enter__(self):
    68. conn, cursor = self.open()
    69. rv = getattr(self.local,'stack',None)
    70. if not rv:
    71. self.local.stack = [(conn, cursor)]
    72. else:
    73. rv.append((conn, cursor))
    74. self.local.stack = rv
    75. return cursor
    76. def __exit__(self):
    77. rv = getattr(self.local,'stack',None)
    78. if not rv:
    79. del self.local.stack
    80. return
    81. else:
    82. conn, cursor = self.local.stack.pop()
    83. self.close(conn, cursor)
    84. def __new__(cls, *args, **kwargs):
    85. if not hasattr(SqlHelper, '_instance'):
    86. SqlHelper._instance = super().__new__(cls)
    87. return SqlHelper._instance
    88. db = SqlHelper()
    89. # with db as c1:
    90. # c1.execute('select sleep(1)')