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