agentbond-api / app /services /database.py
Karan6124's picture
fix: add pool_pre_ping and pool_recycle to prevent stale Neon connection errors
4b9badf
Raw
History Blame Contribute Delete
1.04 kB
import os
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from dotenv import load_dotenv
load_dotenv()
DATABASE_URL= os.getenv("DATABASE_URL")
if not DATABASE_URL:
raise ValueError("DATABASE_URL environment variable is not set")
# Neon DB connections sometimes require sslmode=require for serverless pooling
if "localhost" not in DATABASE_URL and "sslmode" not in DATABASE_URL:
if "?" in DATABASE_URL:
DATABASE_URL += "&sslmode=require"
else:
DATABASE_URL += "?sslmode=require"
engine = create_engine(
DATABASE_URL,
pool_pre_ping=True, # Test connection health before use; silently replaces dead connections
pool_recycle=300, # Recycle connections every 5 min, before Neon's idle timeout closes them
)
SessionLocal= sessionmaker(autocommit= False, autoflush= False, bind= engine)
Base= declarative_base()
def get_db():
db= SessionLocal()
try:
yield db
finally:
db.close()