BREATHE / backend /utils /scheduler.py
tannuiscoding's picture
updated readme
3782d65
"""
Background scheduler for periodic tasks like keeping the database alive.
"""
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
logger = logging.getLogger(__name__)
def keep_db_alive(db):
"""
Execute a simple query to keep the database connection alive.
Prevents connection timeouts from idle databases.
"""
try:
# Execute a simple query to test the connection
db.session.execute("SELECT 1")
db.session.commit()
logger.debug("Database keep-alive ping successful")
except Exception as e:
logger.warning(f"Database keep-alive ping failed: {e}")
try:
db.session.rollback()
except Exception as rollback_err:
logger.error(f"Failed to rollback after keep-alive error: {rollback_err}")
def init_scheduler(app, db):
"""
Initialize the background scheduler with periodic database keep-alive jobs.
Args:
app: Flask application instance
db: SQLAlchemy database instance
"""
scheduler = BackgroundScheduler()
# Add a job to ping the database every 5 minutes (300 seconds)
# Adjust the interval as needed based on your database provider's timeout policy
scheduler.add_job(
func=keep_db_alive,
args=[db],
trigger=IntervalTrigger(seconds=300), # 5 minutes
id="keep_db_alive",
name="Keep database connection alive",
replace_existing=True,
)
try:
scheduler.start()
logger.info("Background scheduler started with database keep-alive job")
except Exception as e:
logger.error(f"Failed to start scheduler: {e}")
return scheduler