2

私のホスティング会社は、15 を超える同時データベース接続を使用しているため、私の Web サイトをブロックしました。しかし、私のコードでは、開いたすべての接続を閉じました。しかし、それでも彼らは同時接続が多すぎると言っています。そして、私のウェブサイトのソースコードを変更する必要があるという解決策を提案してくれました。それで、これについての解決策を教えてください。そして、私のウェブサイトは動的なので、静的で単純な HTML の古いタイプにすることで違いが生じるでしょうか?

con.open()また、考えられる解決策がないときにこれを試したことにも注意してくださいcon.Close()

4

5 に答える 5

3

最初に行うことは、いつ接続を開くかを確認することです。それを最小限に抑えることができるかどうかを確認してください。たとえば、さまざまな接続で「n + 1」を実行していますか?

単一のサーバーを使用している場合、ここでの技術的な解決策はセマフォです。たとえば、次のようなものです。

someSemaphore.TakeOne();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    someSemaphore.Release();
}

これにより、(たとえば、一部のセマフォが共有されていると仮定してstatic)一度にそのブロックに「n」回しかアクセスできないことが保証されます。あなたの場合、15 個のスペースでセマフォを作成します。

static readonly Semaphore someSemaphore = new Semaphore(15,15);

でも!注意をお勧めします: 場合によっては、デッドロックが発生する可能性があります: 不十分に作成された 2 つのスレッドがそれぞれ 9 つの接続を必要とすることを想像してください - スレッド A は 7 を必要とし、スレッド B は 8 を必要とします。したがって、WaitOneタイムアウトを使用することが重要です。

static void TakeConnection() {
     if(!someSemaphore.TakeOne(3000)) {
         throw new TimeoutException("Unable to reserve connection");
     }
}
static void ReleaseConnection() {
     someSemaphore.Release();
}
...
TakeConnection();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    ReleaseConnection();
}

IDisposableより便利に使用するために、それをラップすることも可能です。

于 2012-12-01T07:55:01.907 に答える
2

ホスティング会社を変更します。

真剣に。

あなたが哀れな小さな家のブログを運営していない限り。

同時に 15 を超えるページ/リクエストを簡単に処理できます。私は常に「コネクションの暴走」には警戒していますが、15 のコネクションを言及する価値があるとは考えていません。これは、レンタカー会社があなたが 15km 以上運転すると文句を言っているようなものです。これは単純に、非常に低い制限です。

ビジーな Web サイトでは、同時に多くのリクエストを受け取ったという理由だけで、50、100、さらには 200 の接続を開くことができます。

于 2012-12-01T07:45:50.783 に答える
1

SQL 接続はプールされていると思います。1 つを閉じると、実際にはそれを接続プールに戻すだけです。

SqlConnection.ClearPool(connection) または SqlConnection.ClearAllPools を使用して実際に接続を閉じることができますが、サイトのパフォーマンスに影響します。

また、接続文字列パラメーター Pooling=false を使用してプーリングを無効にすることもできます。最大プール サイズ (デフォルトは 100) もありますが、それよりも小さい数値に設定することをお勧めします。

これはすべてうまくいくかもしれませんが、プロバイダーを切り替えることもお勧めします....

于 2012-12-01T08:08:22.713 に答える
1

これはそれほど明白なことではありませんが、接続を適切に開いたり閉じたりすることに関心がある場合でも、特定の何かを確認する必要があります。

接続文字列を作成するために使用するテキストにわずかな変更を加えると、.net は既に開いている接続を使用するのではなく、まったく新しい接続を作成します (接続が MARS を使用している場合でも)。 Web 構成から単一の接続文字列を使用する代わりに、その場で接続文字列を作成しています。

于 2012-12-01T07:54:18.777 に答える
0

データベースからデータを取得するだけであれば、ある種のキャッシュを作成することはそれほど難しくありません。ただし、完全な CRUD がある場合は、ホスティング プロバイダーを変更することをお勧めします。

于 2012-12-01T07:58:19.277 に答える