問題タブ [connection-pooling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - ADO.NET SQLServer:閉じた接続がS-DBロックを保持しないようにする方法は?
i SqlConnectionオブジェクトを破棄しますが、もちろん実際には閉じていません。データベース オブジェクトのロックを保持しないようにするには、接続を閉じる必要があります。閉じた接続がロックを保持しないようにするにはどうすればよいですか?
知らない人のための上記の文の説明:
ADO または ADO.NET 接続を閉じても、実際には SQL Server への接続が切断されているわけではありません。ADO/ADO.NET インフラストラクチャは、再度使用したい場合に備えて接続を維持します。接続は、「接続プール」と呼ばれるものに残ります。
数分間使用されないと、接続は実際に閉じられます。しかし、そうではありません。TCP/IP には、TCP 接続をさらに数分間 (「CLOSE_WAIT」状態で) 開いたままにする独自の方法があります。これは、同じ IP:Port への TCP 接続を再度開くように要求した場合に行われます。その場合、すでに開いている TCP 接続を使用できます。
接続プールと SQL Server を使用すると、SQL Server への接続が確立されたままになります。各接続には、それが置かれているデータベース コンテキストがあります。接続がそのデータベースに置かれている限り、接続はそのデータベースの共有データベース (S-DB) ロックを保持します。
共有データベース ロックは、単に「私がいる間はこのデータベースを削除しないでください」という意味です。
接続プールの利点を維持しながら、データベースで共有ロックを保持しないようにするにはどうすればよいですか?
現在の私のアドホックな解決策は、開発者が Dispose を呼び出すたびに:
これをグローバル ヘルパー関数の呼び出しに変更します。
これにより、データベース コンテキストがmasterに変更されます。
それは私の差し迫った問題を解決します。閉じた接続がデータベースのロックを保持していません。
しかし今、私は接続プーリングが頭脳を混乱させるのではないかと心配しています.
誰かが知らなかった場合、または別の方法で考えた場合:
SDKから:
CloseとDisposeは機能的に同等です。
jdbc - Glassfish アプリケーション サーバーの JDBC と接続プール
EAR デプロイメントで接続プールと JDBC 接続をセットアップしたいので、デプロイメント先のアプリケーション サーバーごとに手動でセットアップする必要はありません。私は何をする必要がありますか?この情報を入れることができる .xml ファイルはありますか?
c# - 使用できないプールされた SqlConnection の検出
sp_setapproleを使用して SqlConnection にアプリケーション ロールを設定しようとすると、Windows イベント ログに次のエラーが表示されることがあります...
接続を開いたプリンシパルがその後新しいセキュリティ コンテキストを想定し、偽装されたセキュリティ コンテキストで接続をリセットしようとしたため、接続が切断されました。このシナリオはサポートされていません。Books Online の「偽装の概要」を参照してください)。
...そして、アプリケーションで一致する例外がスローされます。
これらはプールされた接続であり、接続プールがアプリの役割と互換性がない時期がありました。実際、Microsoft からの古いアドバイスは、接続プールを無効にすることでした(!!)。プールに戻す前に接続を消去します。
これらのエラーは、(理由は不明ですが) sp_unsetapprole が閉じられて接続プールに返される前に接続で実行されなかった場合に発生すると考えられます。この接続がプールから返されると、sp_approle は失敗する運命にあります。
この例外をキャッチして処理することはできますが、差し迫った障害を検出し、例外 (およびイベント ログのメッセージ) を完全に回避したいと考えています。
例外を発生させずに問題を検出することはできますか?
考えやアドバイスを歓迎します。
c# - 例外が発生する前に、例外を引き起こす条件を検出するにはどうすればよいですか?
私はこの質問にうまく対応できなかったので、問題を実証するためにこの可能な限り単純なテスト ケースを作成しました。
以下のコードでは、接続を使用する前に接続が使用できないことを検出できますか?
KABOOM は、Windows イベント ログにエラーとして現れます。
接続を開いたプリンシパルがその後新しいセキュリティ コンテキストを想定し、偽装されたセキュリティ コンテキストで接続をリセットしようとしたため、接続が切断されました。このシナリオはサポートされていません。Books Online の「偽装の概要」を参照してください。
...さらにコードの例外。
setAppRole は、接続にアプリケーション ロールを設定する簡単な方法です。これに似ている...
実際のコードでは、接続を閉じる前にsp_unsetapproleを使用しようとしますが、常に保証されるとは限りません (継承されたバグのあるマルチスレッド アプリ)。いずれにせよ、kaboom を発生させる前にそれを検出できると期待するのは妥当と思われます。
.net - サーバーごとに接続プールの動作が異なるのはなぜですか?
入力のストリームを読み込んでデータベースに書き込むプログラムがあります。ユーザー入力はありません。
このプログラムは現在、開発サーバーと本番サーバーの両方で並行して実行されており、入力と同じデータを使用して、異なる出力サーバーに書き込みます。
開発サーバーでは、すべてが正常です。一度に約30のプールされた接続が開いていて、正常に実行されます(これは高く聞こえるかもしれませんが、入力ごとにいくつかの連続した短いクエリを実行し、大量のデータがあります)。本番サーバーでは、常に100接続で最大になり、プールで使用可能な接続が不足していることを示す例外がスローされることがあります。
この不一致を引き起こしている可能性のあるSQLServer設定の種類はありますか?他の唯一の違いは、実稼働サーバーがさまざまなソースから追加の負荷を受けていることです。
プール内の接続数を増やすこともできますが(どれだけがそれを満たすかはわかりませんが)、これを引き起こしている原因を理解したいと思います。
sql - sp_reset_connection は何をしますか?
sp_reset_connection は SQL Server 接続プールによって呼び出され、プールから再利用された接続の設定のほとんどがリセットされるようにします。誰かがそれが何をし、何をしないかを正確に知っていますか?
たとえば、この投稿から、トランザクション分離レベルがリセットされないことがわかります
java - Proxool の最大接続数
私はproxool Java 接続プール (バージョン 0.9.1) を使用しています。最大接続数に達するまで、すべて正常に動作します。最大接続数に達すると、proxool はすぐに以下をスローしSQLExcepion
ます。
もちろん、代わりにn
最大接続数が表示されます。
SQLException
利用可能な接続を待つのではなく、proxool がすぐにスローするのはなぜですか? もちろん永遠ではありませんが、構成可能なタイムアウトは素晴らしいでしょう。
重要かどうかはわかりませんが、Tomcat J2EE アプリケーションで proxool を使用しています。proxool のパラメーターは で定義されており、 Proxool DataSource Supportcontext.xml
を使用しています。