У меня есть такой класс:
class DBAlchemy_async(DB_Base, metaclass=Singleton):
def init(self, logger: 'BaseLogger', connection_string: str):
self.logger = logger
self.engine_dashboard = create_async_engine(f'{connection_string}/dashboard')
self.session = sessionmaker(class_=AsyncSession)
self.session.configure(bind=self.engine_dashboard)
# self.session.configure(binds={Base_dashboard:self.engine_dashboard, Base_dashboard_dex:self.engine_dashboard_dex, Base_stats:self.engine_stats, Base_ops:self.engine_ops})
@asynccontextmanager
async def _async_session_scope(self, table_name: str, operation: str):
async with self.session(expire_on_commit=False) as session:
try:
t = time.time()
yield session
await session.commit()
except Exception:
await session.rollback()
raise
finally:
await session.close()
self.logger.log({'text': operation, 'time': time.time()-t, 'object': table_name})
async def get(self, table: 'Model', *keys: BinaryExpression) -> Optional['Model']:
async with self._async_session_scope(table.tablename, 'async_get') as session:
query = select(table).where(*keys)
result = await session.execute(query)
return result.scalar()
Иногда, не постоянно, я вижу что возникает ошибка
raise OperationalError(CR.CR_SERVER_LOST, msg) from e
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query').
Возникает при асинхронной работе с базой, при синхронной все окей, не понимаю почему такое происходит. Такое впечатление, что база стоит в простое, потом приходит запрос, возникает ошибка эта, а последующие все запросы отрабатывают хорошо к базе с использованнием метода get этого.
Коннекты максимальное количество 2000, используется в среднем 170. Возможно нужно настроить параметры pool_size и max_overflow в SQLAlchemy, потому что они используют возможно дефолтно 200 коннектов как для mysql?