[PR #24656] fix: prevent database connection leaks in chatflow mode by using Session-managed queries #30732

Closed
opened 2026-02-21 20:48:07 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/langgenius/dify/pull/24656

State: closed
Merged: Yes


Important

  1. Make sure you have read our contribution guidelines
  2. Ensure there is an associated issue and you have been assigned to it
  3. Use the correct syntax to link this PR: Fixes #<issue number>.

Summary

close #24076

This PR fixes database connection leaks in chatflow mode that were causing connections to remain open for extended periods, potentially leading to connection pool exhaustion and performance degradation.

Changes Made

Root Cause: The original implementation used the global db.session object for database queries in long-running workflow threads, which prevented proper connection cleanup and caused connections to be held indefinitely.

Solution: Replaced direct db.session queries with session-managed queries using Session(db.engine, expire_on_commit=False) pattern to ensure proper connection lifecycle management.

Modified Files

  1. core/app/task_pipeline/message_cycle_manager.py

    • Replaced db.session.query(MessageFile) calls with session-managed queries
    • Added proper session management for MessageFile retrieval operations
  2. core/app/apps/advanced_chat/app_runner.py

    • Updated App record queries to use session-managed approach
    • Added SQLAlchemy imports for Session and select
  3. core/app/apps/message_based_app_generator.py

    • Refactored Conversation and Message queries to use independent sessions
    • Ensured proper connection cleanup for database operations
  4. core/app/apps/advanced_chat/app_generator.py

    • Optimized database connection lifecycle management
    • Moved thread startup to occur before db.session.close() to prevent connection leaks
    • Adjusted object refresh timing to ensure data consistency

Impact

  • Prevents database connection leaks in chatflow mode
  • Improves system stability and performance under load
  • Reduces risk of connection pool exhaustion
  • Maintains existing functionality without breaking changes

Screenshots

Before After
... ...

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.
  • I ran dev/reformat(backend) and cd web && npx lint-staged(frontend) to appease the lint gods
**Original Pull Request:** https://github.com/langgenius/dify/pull/24656 **State:** closed **Merged:** Yes --- > [!IMPORTANT] > > 1. Make sure you have read our [contribution guidelines](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) > 1. Ensure there is an associated issue and you have been assigned to it > 1. Use the correct syntax to link this PR: `Fixes #<issue number>`. ## Summary close #24076 This PR fixes database connection leaks in chatflow mode that were causing connections to remain open for extended periods, potentially leading to connection pool exhaustion and performance degradation. ### Changes Made **Root Cause**: The original implementation used the global `db.session` object for database queries in long-running workflow threads, which prevented proper connection cleanup and caused connections to be held indefinitely. **Solution**: Replaced direct `db.session` queries with session-managed queries using `Session(db.engine, expire_on_commit=False)` pattern to ensure proper connection lifecycle management. ### Modified Files 1. **`core/app/task_pipeline/message_cycle_manager.py`** - Replaced `db.session.query(MessageFile)` calls with session-managed queries - Added proper session management for MessageFile retrieval operations 2. **`core/app/apps/advanced_chat/app_runner.py`** - Updated App record queries to use session-managed approach - Added SQLAlchemy imports for Session and select 3. **`core/app/apps/message_based_app_generator.py`** - Refactored Conversation and Message queries to use independent sessions - Ensured proper connection cleanup for database operations 4. **`core/app/apps/advanced_chat/app_generator.py`** - Optimized database connection lifecycle management - Moved thread startup to occur before `db.session.close()` to prevent connection leaks - Adjusted object refresh timing to ensure data consistency ### Impact - ✅ Prevents database connection leaks in chatflow mode - ✅ Improves system stability and performance under load - ✅ Reduces risk of connection pool exhaustion - ✅ Maintains existing functionality without breaking changes ## Screenshots | Before | After | |--------|-------| | ... | ... | ## Checklist - [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs) - [x] I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!) - [x] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change. - [x] I've updated the documentation accordingly. - [x] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
yindo added the pull-request label 2026-02-21 20:48:07 -05:00
yindo closed this issue 2026-02-21 20:48:07 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langgenius/dify#30732