File size: 1,767 Bytes
3782d65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
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