My Application:大量(> 10k)のJSONファイルをFTP経由でフェッチし、その内容をローカルSQL Server 2016のテーブルに書き込みますインスタンス。ファイルのフォルダーがインポートされた後、さらにデータ処理を処理するT-SQLプロシージャーがトリガーされます。 全体的にこのソリューションは非常にうまくいくようです。しかし、私は十分なパフォーマンスを得るために高度な並列処理が必要です。通常、各ファイルには約2,000のエントリがあり、フォルダあたり約5,000ファイルをインポートする必要があります。 SQL Serverはローカルで実行され、ステートメントのパフォーマンスは問題になりません。パラレル挿入ステートメントを使用してSQL Serverで接続が枯渇しました
実行構造:ファイルリストはFTP経由で取得され、各ファイル名はGoroutineに引き渡されます。 go-routineは、(FTP経由でも)ファイルを取り出し、解析してSQL挿入をトリガーします。 ("INSERT INTO tbl(val1、val2、val3)SELECT $ 1、$ 2、$ 3")を実行し、ゴルーチン(stmt.Exec(var1、var2、val3) var3))を入力します。 チャネル変数(make(chan bool、MAXPAR)、MAXPAR = 10、ただし30である必要があります)で実行中のルーチンの最大数を制御します。
問題:私は〜15のパラレルルーチン(30が最適だろう)私はしばらくの間(〜1Kファイル)の後に次のエラーを取得する
ネットワーク関連またはインスタンスよりも多くを開始するたびに127.0.0.1:1433でSQL Serverへの接続を確立する際に、特定のエラーが発生しました。通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の使用は1つだけ許可されます。
これはTCP/IPスタック(?)の枯渇を示している可能性がありますが、私の問題の解決策がまだ見つかりませんでした。コードの構造上、30文(MAXPARが30に設定されている場合)だけが同時に実行されるため、問題は接続の数であってはなりません。私が理解しているように、並列性の程度ではないかもしれませんが、ここでは1秒あたりの実行回数が制限要因です。
私のアイデア:現在、私は助けることができる3つのシナリオを考えることができます:10までMAXPARを制限
- しかし、これはパフォーマンスの低下につながり、問題が最終的にかどうかはわかりませんその設定でも発生します
- プログラムの開始時により多くの接続を確立し、ランダムに各ジャンプルーチンに接続の1つを割り当てます。これは、実行/接続の量を低下させるが、私は毎秒全体の実行回数が問題であれば問題が解決するかどうかはわかりません。
- バルクステートメントのフォームを使用して、エントリごとに1つではなく、ファイルごとに1つの挿入ステートメントを送信します。
最後のオプションは、現在のところ、私はそれが動作すると確信しています。しかし、類似の挿入スクリプト(問題がこれまでには発生していなかったところ)があるので、根本的な問題を理解し、すべてのアプリケーションを変更する前にそれを防ぐ手段があるかどうかを知りたいです。
質問:私の質問は、誰かがこの問題が発生したときの経験があるかどうかです。上記の解決策の1つ(または別の解決策)があなたの経験からうまくいくかどうかを判断することができます。それがちょうど約1つのスクリプトであれば、私はすべてのソリューションを試してみたいと思いますが、同様の問題を経験できるかどうか分からないスクリプトもありますので、私が合理的に確信できる解決策を探していきたいと思いますこれが解決された
システム
- のWindows 10のx64
- のSQL Server 2016 Developer Editionの(x64)の
- ゴー1.6
- 図書館:github.com/denisenkom/go-mssql
ありがとうございました
"SQL Server Developer Edition"の特定の制限ではありませんか? – ain
Microsoft(https://www.microsoft.com/en-gb/server-cloud/products/sql-server-editions/overview.aspx)によれば、開発者エディションには同じ機能(少なくともデータベースエンジン)が必要です。ただし、本番環境で使用する権利は除きます。高価なライセンスにお金を費やす前に、サーバーが実際にデータ量を実際に処理できるかどうかを最初に確認したいので、これをここで使用しました。 – user2599201