4

現在の tinyTDS gem 0.6.2 を使用して、Rails 3.2.12 (Ruby 1.9.3) で Ruby on Rails アプリケーションを実行しています。

MS SQL 2012 または 2014 を使用しており、通常よりも多くの次のエラー メッセージに直面しています。

TinyTds::Error: Adaptive Server connection timed out: EXEC sp_executesql [...]

データベースの AUTOCLOSE はオフです。TCP ソケット タイムアウトは、デフォルトの Windows システムです。

アプリケーション サーバーはマシン #1 (Windows サーバー) にあり、SQL サーバーはマシン #2 (Windows サーバー) にあります。

接続 (netstat) を確認すると、約 20 ~ 30 人のユーザーに対して 250 の接続が開いています。perform.exe を実行して、データ ディスクとログ ディスクの SQL サーバーでのアイドル時間を確認しました。

database.yml には接続がpool:32ありreconnect:trueます。

私には、tinyTDS が接続を失ったように見え、例外によって再接続が妨げられます。

問題は、問題をデバッグして問題を特定するにはどうすればよいかということです。

アップデート

私の間違いです。元のエラー メッセージは tinytDS 0.5.x のものです。最新バージョンに更新したため、追加または代わりに次のエラーが表示されます。

ActiveRecord::LostConnection (TinyTds::Error: DBPROCESS is dead or not enabled: BEGIN TRANSACTION):
4

1 に答える 1

5

まず、そのプール サイズが大きすぎるようです。大量のスレッドを使用していますか? そうでない場合は、アプリの要求/応答ごとに 1 つの接続のみが使用されます。その値が高すぎるようです。

次に、どの SQL がタイムアウトしたか? 特定の SQL が他の SQL より遅いことに気付きましたか? もしそうなら、あなたには2つの選択肢があります。1 つ目は、インデックスなどの標準的な手法を使用して DB を調整することです。2 つ目は、database.yml の「タイムアウト」オプションを増やすことです。デフォルトのタイムアウトは 5000 (5 秒) です。10000に設定してみましたか?私が求めているのは、これが「接続」タイムアウトと「待機」タイムアウトであるとどのように確信しているのかということです。

于 2014-12-05T12:51:29.460 に答える