Асинхронный код постоянно выпадает с TimeoutException
Уже не делю не могу найти ошибку в казалось бы простом коде. Начал думать, что проблема не в коде, а в драйвере PostgreSQL. Буду благодарен уже за любые идеи т.к. код выглядит слишком простым, чтобы каждый раз падать с TimeoutException.
class QueryResultCache {
List<RequestCacheStruct> requestsCacheList = [];
Map<int, Future<PostgreSQLResult>> pendingFutures = {};
Future<void> addResultToCache(sqlQuery) async {
try {
if(pendingFutures.containsKey(sqlQuery.hashCode)) {
print('This query is already running');
await pendingFutures[sqlQuery.hashCode];
}
else {
pendingFutures.addAll({sqlQuery.hashCode: connection.query(sqlQuery, timeoutInSeconds: 3600)});
var queryResult = await pendingFutures[sqlQuery.hashCode]; // run pending Future
var queryObj = RequestCacheStruct(sqlQuery.hashCode, DateTime.now(), queryResult! );
requestsCacheList.add(queryObj);
await pendingFutures.remove(sqlQuery.hashCode); // remove competed Future
print('Query was added to сache');
}
}
on TimeoutException catch(e) {
print('TimeoutException: ${e.message}' );
}
}
}
Идея такая. Что я пишу кэш для запросов. Если SQL запрос уже выполняется, но нужно предотвратить его повторное выполнение. Однако код постоянно сваливается с TimeoutException и сваливается сразу после выполнения нескольких запросов (т.е. в течении 30-40 секунд).
Про то что теоретически может быть коллизия hashCodeя знаю, но сейчас не про это.
Полный код класса такой.
upd: судя по всему в драйвере есть ошибка https://github.com/stablekernel/postgresql-dart/issues/167 и выставление
connection.query(sqlQuery, timeoutInSeconds: 3600)
не работает
и нужно прям в подключении выставлять:
connection = PostgreSQLConnection('localhost', 5432, 'test', username: 'postgres', password: '12345', queryTimeoutInSeconds: 3600); // here