db.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import sqlite3
  2. from threading import Lock
  3. class SQLitePool:
  4. def __init__(self, db_path, pool_size=5):
  5. self.db_path = db_path
  6. self.pool_size = pool_size
  7. self.pool = []
  8. self.lock = Lock()
  9. for _ in range(pool_size):
  10. self.pool.append(self._create_connection())
  11. def _create_connection(self):
  12. return sqlite3.connect(self.db_path, check_same_thread=False)
  13. def get_connection(self):
  14. with self.lock:
  15. if self.pool:
  16. return self.pool.pop()
  17. else:
  18. return self._create_connection()
  19. def return_connection(self, conn):
  20. with self.lock:
  21. if len(self.pool) < self.pool_size:
  22. self.pool.append(conn)
  23. else:
  24. conn.close()
  25. db_pools = {}
  26. def get_db_pool(db_path):
  27. if db_path not in db_pools:
  28. db_pools[db_path] = SQLitePool(db_path)
  29. return db_pools[db_path]
  30. def get_db_connection(db_path):
  31. pool = get_db_pool(db_path)
  32. return pool.get_connection()
  33. def return_db_connection(db_path, conn):
  34. pool = get_db_pool(db_path)
  35. pool.return_connection(conn)