Я заметил, что в средах Java такого поведения обычно не происходит (соединения закрываются немедленно, если @Transaction не сохраняет их открытыми), поэтому я нахожу такое поведение в Python странным.
Я подозреваю, что это может быть связано с Пул соединений SQLAlchemy сохраняет соединения для повторного использования. Я попытался отключить пул соединений (с помощью NullPool), но соединение по-прежнему остается «спящим» в базе данных.
Вот моя настройка data.py:
Код: Выделить всё
# Session configuration
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
expire_on_commit=False,
bind=Engine
)
def get_db() -> Generator[Session, None, None]:
db = SessionLocal()
try:
yield db
except Exception as e:
print(f"Error in session: {e}")
db.rollback()
raise e
finally:
print("Closing database session.")
db.close()
Код: Выделить всё
# Inside a FastAPI route
integracao_data = IntegracaoPDVCreate(
idEstabelecimento=id_estabelecimento_fixo,
tipo=tipo_arquivo,
dadosArquivo=texto
)
# CRUD operation
db_item = crud.create_integracao_pdv(db=db, item=integracao_data)
# Critical Commit
db.commit()
# Refresh the item (starts a new implicit transaction/select?)
db.refresh(db_item)
- Это нормально для SQLAlchemy с pyodbc оставлять соединения в «спящем» состоянии даже после вызова db.close() в блокеfinally?
- Сохраняет ли db.refresh(db_item) соединение открытым после совершить?
- Как убедиться, что соединение физически закрыто или правильно возвращено в пул, не оставляя артефактов в SQL Server?
- Python 3.x
- FastAPI
- SQLAlchemy
- SQL Server
- Драйвер: Драйвер ODBC 17 для SQL Server
Подробнее здесь: https://stackoverflow.com/questions/798 ... quest-fini
Мобильная версия