Spaces:
Running
Running
| """ | |
| 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 | |