В приложении ASP.NET, которое я пишу, мне нужно использовать подключения к определенному серверу (что-то вроде БД, но ... другое). Соединения довольно дороги для установки (несколько секунд, буквально), поэтому я пытаюсь написать пул для повышения масштабируемости.ASP.NET и длинные фоновые потоки - как они смешиваются?
Все довольно просто, до одной точки - переработка старых соединений. Со старым я имею в виду «соединения, которые были в пуле неиспользованными дольше, чем, скажем, 5 минут». Очистка их также освободит ресурсы на сервере, к которому они подключаются.
Мне нужна какая-то нить, которая просыпается каждые 5 минут, проверяет старые неиспользуемые соединения в пуле и закрывает их. Однако, как я понял из Google, ASP.NET и длинные потоки не смешиваются.
Я не боюсь, что весь процесс будет прекращен, потому что тогда мой бассейн тоже будет очищен (деструкторы и все). Я боюсь, что мой поток очистки может быть прерван до того, как мое приложение завершится (и мой пул останется без уборщика). Или наоборот - моя чистящая нить блокирует мое приложение от закрытия.
Как это осуществить правильно?
Несколько человек предложили внешнюю службу, которая сделает это. Я расскажу о «услуге« mysterios », чтобы вы могли понять, почему это невозможно.
«Таинственное обслуживание» - это бегемот приложения, написанное моей компанией более 10 лет. Это приложение учета Delphi, которое использует MSSQL или Oracle для своих данных. Другого сервера нет.
Недавно (как и несколько лет назад) он также приобрел интерфейс, который внешние приложения могут использовать для связи с ним. Это консольное приложение Windows, которое в основном является одним и тем же приложением, за исключением того, что вместо GUI он слушает сокет и использует некоторую сериализацию Delphi для передачи данных вперед и назад.
На стороне клиента есть .DLL (написанный на Java, позже модифицированный для компиляции под J #), который анализирует этот поток двоичных данных и имитирует бизнес-уровень в .NET. То есть - я получаю все те же бизнес-классы (700+), что и в исходном приложении в Delphi. Или что-то довольно близко к этому (я думаю, что у приложения есть> 3000 классов). И я должен использовать их для выполнения любой бизнес-логики, которую я хочу. Все мои вызовы перенаправляются на реальное приложение, которое затем выполняет эту работу.
Я не могу напрямую подключиться к БД MSSQL/Oracle, потому что на сервере существует много бизнес-логики bizzare, которую я должен был бы повторить и поддерживать (приложение постоянно разрабатывается). Я не могу воссоздать клиента .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 (не уверены, являются ли эти синглеты тоже, я думаю, нет), и им нужен специальный код для заполнения и т. д.
В целом, я бы назвал систему «patchware» - поскольку кажется, что это было сделано миллионными патчами и обходными решениями, которые все сливались во что бы то ни было было наиболее удобным в то время.
Bump? (как вы все-таки натыкаетесь?)