Описание задачи
Выявлены архитектурные недочеты в реализации пулов подключений SqliteConnectionPool и MysqlConnectionPool: утечка соединений поверх лимита maxEntries, незакрытые таймеры простоя и отсутствие нормализации исключений при подключении.
Зачем
- Предотвратить неконтролируемое разрастание пула соединений SQLite (
maxEntries overflow) при интенсивной работе или открытии множества вкладок.
- Исключить фантомные срабатывания таймеров простоя (
idleTimer) после вытеснения соединения из пула.
- Обеспечить корректный перехват и отображение в UI ошибок аутентификации и сетевых сбоев MySQL.
Предлагаемые изменения
- Для
SqliteConnectionPool (lib/core/database/sqlite_connection_pool.dart):
- В
_evictIfNeededBeforeNewSlot() заменить break; при отсутствии свободных (refs == 0) слотов на выброс StateError('SQLite connection pool exhausted: $maxEntries slots in use.') по аналогии с PostgreSQL и MySQL.
- При вытеснении старой записи из пула обязательно отменять таймер:
oldestEntry?.idleTimer?.cancel(); и использовать асинхронное закрытие unawaited(oldestEntry?.connection.disconnect());.
- Для
MysqlConnectionPool (lib/core/database/mysql_connection_pool.dart):
- Обернуть блок создания соединения в
_creationLock.createIfAbsent в try/catch с пробросом MysqlConnectionException и сохранением stackTrace (Error.throwWithStackTrace), как это сделано в PostgresConnectionPool.acquire.
Технические требования
Место в коде (ориентир)
lib/core/database/sqlite_connection_pool.dart
lib/core/database/mysql_connection_pool.dart
test/core/database/sqlite_connection_pool_test.dart (создать при необходимости)
test/core/database/mysql_connection_pool_test.dart
Acceptance Criteria
Scope
- Scope:
desktop
- Component:
Core / Database / ConnectionPool
- Kind:
bug
Описание задачи
Выявлены архитектурные недочеты в реализации пулов подключений
SqliteConnectionPoolиMysqlConnectionPool: утечка соединений поверх лимитаmaxEntries, незакрытые таймеры простоя и отсутствие нормализации исключений при подключении.Зачем
maxEntriesoverflow) при интенсивной работе или открытии множества вкладок.idleTimer) после вытеснения соединения из пула.Предлагаемые изменения
SqliteConnectionPool(lib/core/database/sqlite_connection_pool.dart):_evictIfNeededBeforeNewSlot()заменитьbreak;при отсутствии свободных (refs == 0) слотов на выбросStateError('SQLite connection pool exhausted: $maxEntries slots in use.')по аналогии с PostgreSQL и MySQL.oldestEntry?.idleTimer?.cancel();и использовать асинхронное закрытиеunawaited(oldestEntry?.connection.disconnect());.MysqlConnectionPool(lib/core/database/mysql_connection_pool.dart):_creationLock.createIfAbsentвtry/catchс пробросомMysqlConnectionExceptionи сохранениемstackTrace(Error.throwWithStackTrace), как это сделано вPostgresConnectionPool.acquire.Технические требования
SqliteConnectionPool._evictIfNeededBeforeNewSlot().try/catchобертку вMysqlConnectionPool.acquire().test/core/database/sqlite_connection_pool_test.dart(на вытеснение и выброс ошибки при переполнении) и вmysql_connection_pool_test.dart.Место в коде (ориентир)
lib/core/database/sqlite_connection_pool.dartlib/core/database/mysql_connection_pool.darttest/core/database/sqlite_connection_pool_test.dart(создать при необходимости)test/core/database/mysql_connection_pool_test.dartAcceptance Criteria
StateError('SQLite connection pool exhausted...'), а не создаются лишние соединения.MysqlConnectionException.Scope
desktopCore / Database / ConnectionPoolbug