Postgresql не выполняет определенный запрос один раз после перезагрузки Windows
Я использую Postgresql на Windows в приложении C#. Проблема, с которой я столкнулся, действительно странная и может быть описана следующим образом:
- я перезапускаю Windows
- я запускаю программу
- один конкретный запрос не выполняется:
SELECT COUNT(*) AS c FROM files WHERE total_bytes IS NOT NULL
- я снова запускаю программу, и все работает нормально
Странные заметки:
- я попытался сделать другой запрос перед этим (даже используя ту же таблицу), и это сработало:
SELECT COUNT(*) AS c FROM files
- я не смог воспроизвести ошибку перезапуск Postgresql. Это происходит только при перезагрузке Windows. И это случается только один раз.
Обратная трассировка исключений:
Npgsql.NpgsqlException: Exception while reading from stream
at Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts)
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadExpecting[T]()
at Npgsql.NpgsqlDataReader.NextResultInternal()
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Npgsql.NpgsqlCommand.ExecuteReader()
at DriveShare.Database.Postgresql.ExecuteQuery(NpgsqlCommand command) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 216
at DriveShare.Database.Postgresql.Query(String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 72
at DriveShare.Database.Postgresql.QueryOne(String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 83
at DriveShare.Database.Postgresql.QueryValue(String key, String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 97
at DriveShare.Database.Postgresql.QueryValue(String key, String sql) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 92
at DriveShare.Database.FileIndexDataSet.CountIndexedFiles() in c:projetosdriveshareclientDriveShareDriveShareDatabaseFileIndexDataSet.cs:line 89
at DriveShare.Engine.DriveShareEngine.Start() in c:projetosdriveshareclientDriveShareDriveShareEngineDriveShareEngine.cs:line 156
at DriveShareWebService.Program.Main(String[] args) in c:projetosdriveshareclientDriveShareDriveShareWebServiceProgram.cs:line 19
Поскольку я должен поддерживать работу программы, я написал обходной путь, чтобы приложение повторило этот запрос, прежде чем продолжить. Я этим не горжусь:
public void WaitForConnection()
{
int limitSeconds = 3 * 60;
var start = DateTime.Now;
while (true)
{
try
{
Log.WaitingForDatabaseConnection();
Query("SELECT COUNT(*) AS c FROM files WHERE total_bytes IS NOT NULL");
Log.DatabaseConnectionAquired();
break;
}
catch (Exception e)
{
var wastedTime = DateTime.Now - start;
if (wastedTime.TotalSeconds > limitSeconds)
throw;
else
Log.Exception(e);
}
Thread.Sleep(1000);
}
}
Я использую Npgsql (в классе тонкой абстракции) для подключения к Postgresql. Журналы Postgresql показывают некоторые записи об ошибках winsock, которые я еще не понимаю:
2016-08-16 10:14:34 BRT LOG: database system was shut down at 2016-08-16 10:12:07 BRT
2016-08-16 10:14:34 BRT FATAL: the database system is starting up
2016-08-16 10:14:34 BRT LOG: MultiXact member wraparound protections are now enabled
2016-08-16 10:14:34 BRT LOG: sistema de banco de dados está pronto para aceitar conexões
2016-08-16 10:14:34 BRT LOG: autovacuum launcher started
2016-08-16 10:17:16 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:17:27 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:17:27 BRT STATEMENT: SELECT path FROM files
2016-08-16 10:17:27 BRT FATAL: connection to client lost
2016-08-16 10:17:27 BRT STATEMENT: SELECT path FROM files
2016-08-16 10:17:27 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:17:27 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:17:33 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:25:14 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:25:15 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:25:15 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:26:30 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:26:30 BRT FATAL: connection to client lost
2016-08-16 10:26:50 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:26:50 BRT FATAL: connection to client lost
2016-08-16 10:26:50 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:26:50 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:27:06 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:27:06 BRT FATAL: connection to client lost
2016-08-16 10:27:06 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:27:06 BRT FATAL: connection to client lost
2016-08-16 10:27:30 BRT LOG: pedido de desligamento rápido foi recebido
2016-08-16 10:27:30 BRT LOG: interrompendo quaisquer transações ativas
2016-08-16 10:27:30 BRT LOG: autovacuum launcher shutting down
2016-08-16 10:27:30 BRT ERROR: canceling statement due to user request
2016-08-16 10:27:30 BRT LOG: autovacuum launcher shutting down
2016-08-16 10:27:30 BRT LOG: shutting down
2016-08-16 10:27:30 BRT LOG: database system is shut down
Я не ожидаю, что кто-то должен знать, в чем именно заключается моя проблема. Я просто надеялся, что у кого-то могли быть подобные проблемы, которые могли бы пролить свет на это.
1 ответ:
С некоторой помощью я нашел решение в Npgsql docs, здесь.
Npgsql по умолчанию поставляется с некоторыми параметрами таймаута для соединения и команд. После перезагрузки Windows, первый доступ к таблице был очень медленным, вызывая тайм-аут команды.
С дополнительными параметрами в строке подключения я смог изменить эти настройки выше и решить свою проблему:
connectionString += ";Timeout=180;Command Timeout=180";Бонусный совет : функция Postgresql
pg_sleep(seconds)помогла мне воспроизвести проблему без фактических перезагрузок. Очень полезно:SELECT pg_sleep(60);
Comments