2016-12-08 31 views
1

こんにちはSO、私は現在APX〜50kのレコードを処理するストアドプロシージャを実行しようとしていますSQL Serverのランダムなタイムアウトの問題

。私を取得何

> [2016-12-08 19:28:24] local.INFO: PDOException: SQLSTATE[HY000]: 
> General error: 20003 Adaptive Server connection timed out [20003] 
> (severity 6) [(null)] in 
> /vendor/laravel/framework/src/Illuminate/Database/Connection.php:479 
> Stack trace: 
> #0 /vendor/laravel/framework/src/Illuminate/Database/Connection.php(479): 
> PDOStatement->execute() 
> #1 /vendor/laravel/framework/src/Illuminate/Database/Connection.php(762): 
> Illuminate\Database\Connection->Illuminate\Database\{closure}(Object(Illuminate\Database\SqlServerConnection), 
> 'EXEC dbo.cleanD...', Array) 
> #2 /vendor/laravel/framework/src/Illuminate/Database/Connection.php(725): 
> Illuminate\Database\Connection->runQueryCallback('EXEC dbo.cleanD...', 
> Array, Object(Closure)) 
> #3 /vendor/laravel/framework/src/Illuminate/Database/Connection.php(480): 
> Illuminate\Database\Connection->run('EXEC dbo.cleanD...', Array, 
> Object(Closure)) 
> #4 /vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(317): 
> Illuminate\Database\Connection->statement('EXEC dbo.cleanD...') 
> #5 /vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(237): 
> Illuminate\Database\DatabaseManager->__call('statement', Array) 

が通過、ということである:それは、など

しかし、比較的長い準備されたステートメントは、常に次のエラー(複数可)になり、別のテーブルにレコードをソートし、いくつかのレコードを削除しますlaravelチャンクの使用、私は何事もなく〜50kのレコードを挿入することができる午前:

$data = $data->chunk(500); 

foreach ($data as $rows) { 
    Log::info("INSERT START: " . date('l jS \of F Y h:i:s A')); 
    DB::table("the.db")->insert($rows->toArray()); 
} 

しかし、すぐに(〜2-4分かかることがあります)ストアドプロシージャの実行など

上記のエラーが発生します。私はストアドプロシージャをlittlerに分割するなど、さまざまなソリューションを試しましたが、まだエラーが発生します。

常に同じエラー:

General error: 20003 Adaptive Server connection timed out [20003] (severity 6) [(null)] in /vendor/laravel/framework/src/Illuminate/Database/Connection.php:479 

私は(laravelでのphp.iniを?)がどこかにひそかな疑いを持って、私はデータベース

のためのタイムアウト制限までに持っているかもしれませんどんなことでも、事前に感謝します!

+1

クエリをいくつかの小さなクエリに分割する可能性はありますか?また、SQL Serverジョブを使用できますか? – EJoshuaS

+0

残念ながら、残念ながら、最も時間のかかるスクリプトはすべて一緒にいなければなりません。 – Derek

+1

可能であれば、特に固定スケジュールで実行されている場合は、可能な限りジョブを作成する価値があります。 – EJoshuaS

答えて

3

これは動作しませんが、別の質問では、PDO::ATTR_TIMEOUTというオプションを使用して強制的に高いタイムアウトを設定しています。私はデフォルトがどんなものか分からない。

'sqlsrv' => [ 
    'driver' => 'sqlsrv', 
    'host'  => env('DB_HOST', 'localhost'), 
    'database' => env('DB_DATABASE', 'forge'), 
    'username' => env('DB_USERNAME', 'forge'), 
    'password' => env('DB_PASSWORD', ''), 
    'charset' => 'utf8', 
    'prefix' => '', 
    'options' => [ 
     PDO::ATTR_TIMEOUT => 240 // 240 seconds. 
    ] 
], 

Can I set a query timeout when using Zend_Db_Adapter_Pdo_Mssql?をご覧ください。

+0

ありがとう、今すぐそれを試してみると私はあなたに戻ってきます。 – Derek

+0

完璧、おかげで束。だからあいまいで、その投稿(あなたが修正を入手した場所)も同じエラーコードではありませんが、うまくいきます!ありがとう、トン。 – Derek

1

@ user3158900が提供する解決策に加えて、私はコメントでこれを言及していますが、コメントを削除する可能性があるのでここで繰り返すだけです。クエリができない場合はSQL Server Jobを使用することを検討してください。もっと細かく分解してください。ジョブは、SQLスクリプトの実行に加えて、あらゆる種類のもの(統合パッケージ、コマンドラインアプリケーション、スクリプトなど)を実行できるので、ルーチンの管理型タスクを自動化するのに最適です。

SQL Serverから離れる場合は、Oracleにはjob schedulerもありますが、私はそれに精通していません。

SQL Serverのロジックをある時点で移動する予定があることを示しているので、時間の可能性がある場合(Windowsサーバーを使用している場合は、 :))は、コンソールアプリケーションを作成し、Windows Task Schedulerを使用して、選択したスケジュールで実行します。コンソールウィンドウを開くことなく、バックグラウンドで実行させることさえできます。

+0

ありがとうございました - もしmssqlがストアドプロシージャのための "火災と忘れ"オプションを持っていたら(別のテーブルw /トリガーなどを設定しなくても) – Derek

関連する問題