讨论数量:
以下是一个基于Python的MySQL数据库连接池的示例,可以类比实现类似SMProxy的功能。具体实现方式可以根据实际需要进行调整和改进。
import pymysql
from queue import Queue
from threading import Lock
class MySQLPool:
def __init__(self, max_conn, host, port, user, password, database):
self._max_conn = max_conn # 最大连接数
self._host = host
self._port = port
self._user = user
self._password = password
self._database = database
self._pool = Queue(max_conn) # 连接池
self._lock = Lock() # 连接池锁
# 创建初始连接
for _ in range(max_conn):
conn = self._create_connection()
if conn:
self._pool.put(conn)
# 获取数据库连接
def get_connection(self):
conn = self._pool.get()
if conn:
return conn
else:
return self._create_connection()
# 释放数据库连接
def release_connection(self, conn):
if conn:
self._pool.put(conn)
# 创建数据库连接
def _create_connection(self):
try:
conn = pymysql.connect(host=self._host, port=self._port,
user=self._user, password=self._password,
database=self._database)
return conn
except Exception as e:
print(e)
return None
# 执行数据库查询
def query(self, sql, params=None):
conn = self.get_connection()
try:
cursor = conn.cursor()
cursor.execute(sql, params)
result = cursor.fetchall()
cursor.close()
return result
except Exception as e:
print(e)
return None
finally:
self.release_connection(conn)
# 执行数据库修改
def execute(self, sql, params=None):
conn = self.get_connection()
try:
cursor = conn.cursor()
cursor.execute(sql, params)
conn.commit()
cursor.close()
return True
except Exception as e:
print(e)
return False
finally:
self.release_connection(conn)
使用时可以简单地实例化MySQLPool类,并调用其中的方法来进行数据库操作,如下所示:
pool = MySQLPool(max_conn=10, host='localhost', port=3306, user='root', password='password', database='test')
# 查询数据
result = pool.query('SELECT * FROM `users` WHERE `id`=%s', (1,))
print(result)
# 修改数据
result = pool.execute('UPDATE `users` SET `name`=%s WHERE `id`=%s', ('Tom', 1))
print(result)
需要注意的是,上面的代码示例仅是一个简单的MySQL连接池实现,没有考虑连接超时、连接断开等异常情况的处理。在实际使用中,需要根据具体需求进行调整和改进。
推荐文章: