1

在我正在编写的 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 对象实例(不确定它们是否也是单例,我认为不是),并且需要特殊代码来填充等。

总而言之,我将系统称为“补丁软件”——因为它似乎是由一百万个补丁和变通方法组成的,所有这些补丁都以当时最方便的方式结合在一起。


撞?(你怎么在这里撞到?)

4

3 回答 3

1

您不需要包装每个类和函数,只需包装您需要执行的操作。因此,您可能需要一个获取一些数据的方法和一个更新一些数据的方法,这将在服务中转换为根据需要对各种函数的一系列调用。前端逻辑将被简化,因此这将简化网站的未来版本。


好的,只是为了解决您自己对这个问题的补充 - 我认为您对“包装器”的含义过于关注了。我希望你已经在做某种包装,或者我可能需要停止假设并直接问你这个问题:你是直接从 asp.net 页面后面的代码调用这个服务,还是你单独构建类来处理前端和服务之间的通信?一旦我们建立了您当前拥有的体系结构,我们将看看将这个逻辑移动到单独的服务是否可行(然后获得 WCF 可以提供的好处)。

于 2008-11-27T13:46:06.467 回答
1

我同意 Chris 的观点,将所有业务逻辑(与所有神秘业务对象通信的代码)放在一个单独的层而不是 Web(表示)层中会更合适。

这将使您的应用程序设计更具可扩展性,并且您将能够更轻松地完成池、线程和其他与可扩展性相关的任务。

如果您选择使用 WCF 在 Web 和业务层之间进行通信(如果它在同一台机器上,则使用名称管道),您将获得一个干净、可扩展和高性能的体系结构。

于 2008-11-27T14:16:00.777 回答
0

You could write a WCF service that wrappers the service you are trying to call and then communicate with this mysterious service only through your WCF service application.

WCF has various models to handle pooling and cleanup.

于 2008-11-27T13:07:09.417 回答