2

サーバー上で継続的に実行する必要がある ruby​​ スクリプトがあります。デーモン gem を使用してデーモン化しました。スクリプトでは、デーモン gem がスクリプトを開始するプロセスの開始と停止を処理するため、無限ループで実行しています。私のスクリプトでは、Sequel gem と tiny_tds を使用して DB インスタンスをセットアップすることから始めます。そのようです:

DB = Sequel.connect(adapter: 'tinytds', host: MSSQLHost, database: MSSQLDatabase, user: MSSQLUser, password: MSSQLPassword)

次に、loop doそれが私の無限ループです。DB.test_connectionその中で、次のようなクエリを使用して接続があるかどうかをテストし、DB に約 1 秒ごとにクエリを実行して、新しいコンテンツがあるかどうかを確認します。

DB['SELECT * FROM dbo.[MyTable]'].all do |row|
    # MY logic here
    # As part of my logic I test to see if I need to delete this row in the table and if so I use
    DB.run('DELETE FROM dbo.[MyTable] WHERE some condition')
end

次に、ロジックの最後で、再びループする直前に、次のようにします。

sleep 1
DB.disconnect

これはすべて、テーブルのチェック、ロジックの実行、行の削除などのすべてで約1時間から1時間半の間うまく機能し、その後停止してこのエラーメッセージが表示されますTinyTds::Error: Adaptive Server connection timed out

私の質問は、なぜそれが起こっているのですか? コードを別の方法で再フォーマットする必要がありますか? DB.test_connection が宣伝されていることを実行しないのはなぜですか? ドキュメントには、接続プールで接続をチェックし、見つかった場合はそれを使用し、そうでない場合は新しい接続を作成すると書かれています。

どんな助けでも大歓迎です

4

2 に答える 2

1

DB.test_connection接続プールから接続を取得するだけで、接続がまだ有効であることを確認しません (ある時点で有効であったか、プールにないはずです)。実際にクエリを送信しない限り、接続が有効であることはありません。connection_validator自動的に行いたい場合は、Sequel に同梱されている拡張機能を使用できます。

フォークする前に Sequel をロードする場合は、フォークする前に呼び出す必要がありますDB.disconnect。そうしないと、複数のフォークされたプロセスが同じ接続を共有することになり、さまざまな問題が発生する可能性があります。

于 2014-04-07T15:11:42.397 に答える
1

最終的に、これをキャッチするレスキュー ステートメントをそこに入れるだけになり、コード行を再実行して DB インスタンスを作成しました。はい、そのインスタンスを既に設定しているという警告がログに記録されますが、それを定数にしないでください。とにかく、今は動いているようで、タイムアウトすることもありますが、順調に回復しています。なぜそれが切断された/切断されているのかを理解できたらよかったのにと思います。

于 2014-04-10T20:15:17.267 に答える