2016-08-16 116 views
3

WindowsでPostgreSQLをC#アプリケーションで使用しています。私がいる問題は本当に奇妙で、次のように説明することができます。Windowsの再起動後にPostgresqlが特定のクエリに失敗する

  • 私はプログラム
  • 一つの特定のクエリが失敗した実行私の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:\projetos\driveshareclient\DriveShare\DriveShare\Database\Postgresql.cs:line 216 
    at DriveShare.Database.Postgresql.Query(String sql, Object[] args) in c:\projetos\driveshareclient\DriveShare\DriveShare\Database\Postgresql.cs:line 72 
    at DriveShare.Database.Postgresql.QueryOne(String sql, Object[] args) in c:\projetos\driveshareclient\DriveShare\DriveShare\Database\Postgresql.cs:line 83 
    at DriveShare.Database.Postgresql.QueryValue(String key, String sql, Object[] args) in c:\projetos\driveshareclient\DriveShare\DriveShare\Database\Postgresql.cs:line 97 
    at DriveShare.Database.Postgresql.QueryValue(String key, String sql) in c:\projetos\driveshareclient\DriveShare\DriveShare\Database\Postgresql.cs:line 92 
    at DriveShare.Database.FileIndexDataSet.CountIndexedFiles() in c:\projetos\driveshareclient\DriveShare\DriveShare\Database\FileIndexDataSet.cs:line 89 
    at DriveShare.Engine.DriveShareEngine.Start() in c:\projetos\driveshareclient\DriveShare\DriveShare\Engine\DriveShareEngine.cs:line 156 
    at DriveShareWebService.Program.Main(String[] args) in c:\projetos\driveshareclient\DriveShare\DriveShareWebService\Program.cs:line 19 

は、私はアプリが先に進む前に、そのクエリを再試行するために、回避策を書きました。私はそれを誇りに思っていないよ。私は、PostgreSQLに接続するために(薄い抽象クラスで)Npgsqlのを使用してい

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); 
    } 
} 

。 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 

私は誰かが私の問題が何であるかを正確に知ることを期待しないでください。私はちょうど誰かがそれにいくつかの光を出すことができるいくつかの同様の問題を抱えていたかもしれないことを望んでいた

+0

PgAdminのような別のクライアントを使用してデータベースを照会すると、同じ奇妙な動作をしますか?または、この奇妙な動作はアプリケーションからのみ発生しますか? @Sstanはちょうどテストされた – sstan

+0

。クエリはPgAdminで機能しましたが、最初の実行では34秒以上かかりました。第2の686ms。 –

+1

私はそれがWindowsのスタートアップの混乱とNpgsqlのタイムアウトの何らかの種類に関連していると推測しています。このクエリは、それを起動するのに十分なほど遅くてもかまいません。 –

答えて

0

いくつかの助けを借りて、Npgsqlドキュメントの解決策を見つけました。here

Npgsqlには、デフォルトで接続とコマンドのタイムアウトパラメータが用意されています。 Windowsを再起動すると、最初にテーブルへのアクセスが非常に遅くなり、コマンドのタイムアウトが発生しました。私は実際、再起動せずに問題を再現助けをPostgreSQLの機能pg_sleep(seconds)

connectionString += ";Timeout=180;Command Timeout=180"; 

ボーナス先端:接続文字列に追加のパラメータを持つ

は私が高いこれらの設定を変更し、私の問題を解決することができました。非常に役に立ちます:

SELECT pg_sleep(60); 
関連する問題