私が書いているASP.NETアプリケーションでは、特定のサーバーへの接続を使用する必要があります(DBのようなものですが...異なる)。接続の確立にはかなりの費用がかかるため(文字通り数秒)、スケーラビリティを向上させるためにプールを作成しようとしています。
すべてが非常にシンプルで、1つのポイントまで、古い接続をリサイクルします。古いとは、「プールに5分以上使用されていない接続」を意味します。それらをクリーンアップすると、接続先のサーバー上のリソースも解放されます。
5分ごとに起動し、プール内の古い未使用の接続をチェックして、それらを閉じる、ある種のスレッドが必要になります。ただし、Googleから理解したように、ASP.NETと長時間実行されるスレッドは混在していません。
プロセス全体が終了することを恐れていません。そうすると、プールもクリーンアップされるためです(デストラクタとすべて)。私が恐れているのは、アプリケーションが終了する前にクリーンアップスレッドが終了する可能性があることです(そして、プールはクリーナーなしで残されます)。または、その逆です。クリーニングスレッドがアプリケーションの終了をブロックします。
これを正しく実装する方法は?
何人かの人々はこれをする外部サービスを提案しました。なぜこれが実現できないのかがわかるように、「ミステリオスサービス」について詳しく説明します。
「不思議なサービス」は、私の会社が10年以上にわたって作成したアプリケーションの巨大なものです。これは、データにMSSQLまたはOracleを使用するDelphiアカウンティングアプリケーションです。他にサーバーはありません。
最近(数年前のように)、外部アプリケーションが通信に使用できるインターフェースも取得しました。これは基本的に同じアプリケーションであるWindowsコンソールアプリケーションですが、GUIの代わりにソケットをリッスンし、ある種のDelphiシリアル化を使用してデータをやり取りします。
クライアント側には、このバイナリデータストリームを解析して.NETのビジネスレイヤーを模倣する.DLL(Javaで記述され、後でJ#でコンパイルするように変更されます)があります。つまり、Delphiの元のアプリケーションと同じビジネスクラス(700以上)をすべて取得します。またはそれにかなり近いもの(アプリケーション自体には3000を超えるクラスがあると思います)。そして、私はそれらを使用して、必要なビジネスロジックを実行する必要があります。私のすべての呼び出しは実際のアプリケーションに転送され、実際のアプリケーションが作業を行います。
サーバーには多くの奇妙なビジネスロジックがあり、それらを複製して維持する必要があるため、MSSQL / Oracle DBに直接接続できません(アプリケーションは常に開発されています)。クライアントの.DLLを再作成することはできません。これは、時間がかかりすぎ、プロトコルがとにかくほぼ同じ結果を指示するためです。そこにある700以上のクラスをすべてラップする必要があるため、ラッパーを作成することはできません。
言い換えれば、私はビジネス層を管理していません。それはそのままです(そして実際には何人かの人々がそれで働き続けるのではなくやめました)。私はただ物事を最大限に活用しようとしています。
クリスと他の好奇心旺盛な人々に。
ものを使用するためのコードは次のようなものです:
ConnectionType con = new ConnectionType;
con.OpenConnection("server", "port", "username", "password");
BLObjectNumber234 obj = (BLObjectNumber234)con.GetBLObject("BLObjectNumber234");
obj.GetByPK(123);
// Do some stuff with obj's properties and methods
// that are different for each BLObject type
これらのBLオブジェクトはかなり無計画です。それらはすべてシングルトンです-への呼び出しはcon.GetBLObject
常に同じインスタンスを返します。ほとんどのデータはDataTable
特別なメソッドを呼び出すことによって取得されますが、かなりの数がプロパティにもあります。いくつかは、bizzareの文書化されていない定数を使用して特別なメソッドを呼び出す必要があります。BLオブジェクトインスタンス以外のプロパティもあり(それらもシングルトンかどうかはわかりませんが、そうではないと思います)、データを入力するために特別なコードが必要です。
全体として、私はこのシステムを「パッチウェア」と呼んでいます。これは、100万のパッチと回避策によって作成されたようで、当時最も便利だった方法ですべてがくっついているためです。
バンプ?(とにかくここでどのようにぶつかりますか?)