在我正在编写的 ASP.NET 应用程序中,我需要使用与特定服务器的连接(类似于 DB 但......不同)。建立连接非常昂贵(字面意思是几秒钟),所以我正在尝试编写一个池来提高可伸缩性。
一切都非常简单,直到某一点 - 回收旧连接。对于旧的,我的意思是“池中未使用时间超过 5 分钟的连接”。清理它们还可以释放它们连接的服务器上的资源。
我需要某种线程,每 5 分钟唤醒一次,检查池中旧的未使用连接,然后关闭它们。但是,正如我从 Google 中了解到的那样,ASP.NET 和长时间运行的线程不会混合使用。
我不害怕整个过程被终止,因为那样我的池也会被清理(析构函数和所有)。我担心的是我的清理线程可能会在我的应用程序终止之前终止(并且我的池没有清洁器)。或者反过来——我的清理线程阻止我的应用程序关闭。
如何正确实施?
有几个人建议使用外部服务来执行此操作。我将详细说明“mysterios 服务”,以便您了解为什么这是不可行的。
“神秘服务”是我公司编写了 10 多年的应用程序的庞然大物。它是一个使用 MSSQL 或 Oracle 作为数据的 Delphi 会计应用程序。没有其他服务器。
最近(就像几年前一样)它还获得了一个外部应用程序可以用来与之通信的接口。它是基本上相同的应用程序的 Windows 控制台应用程序,除了它不是 GUI 而是侦听套接字并使用某种 Delphi 序列化来来回传递数据。
在客户端有一个 .DLL(用 Java 编写,后来修改为在 J# 下编译),它解析这个二进制数据流并模仿 .NET 中的业务层。也就是说 - 我得到了与 Delphi 中的原始应用程序相同的所有业务类 (700+)。或者非常接近的东西(我认为应用程序本身有> 3000个类)。而且我必须使用它们来执行我想要的任何业务逻辑。我所有的呼叫都会被转发到真正的应用程序,然后由它来完成工作。
我无法直接连接到 MSSQL/Oracle 数据库,因为服务器中有很多奇怪的业务逻辑,然后我必须复制并跟上这些逻辑(应用程序正在不断开发中)。我无法重新创建客户端 .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
通过调用特殊方法获得的,但也有不少是在属性中;有些需要使用奇怪的未记录常量调用特殊方法;还有一些属性是其他 BL 对象实例(不确定它们是否也是单例,我认为不是),并且需要特殊代码来填充等。
总而言之,我将系统称为“补丁软件”——因为它似乎是由一百万个补丁和变通方法组成的,所有这些补丁都以当时最方便的方式结合在一起。
撞?(你怎么在这里撞到?)