如何创建一个共享对象,从内存而不是数据库读取集合数据,以提高服务器性能






3.86/5 (6投票s)
2003年11月5日
4分钟阅读

82333

488
如何创建共享对象,
IIS 上的远程对象
问题:有时我们需要从数据库中获取相同的、不变的集合数据,例如用户、城市、国家等。如何避免重复访问数据库,以提高服务器性能?
解决方案:使用由 IIS 托管的 .NET Remoting Singleton 对象。这样,该对象将在所有应用程序之间共享。一个程序可以运行为服务,将数据从数据库填充到该对象中。其他应用程序可以从 IIS 访问此对象(参见下图)。
让我们以(针对用户)以下示例为例。
远程对象生命周期
InitializeLifetimeService
从 MarshByREfObejct
继承(请参阅下面的代码)。
// This would make the object have an infinite lifetime
// (as long as the host is active)
public override Object InitializeLifetimeService ()
{
return null;
}
IIS 配置
在 Web.Config 文件中
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton"
type="UsersNamespace.UserClass, Users" objectUri="Users.rem" />
</service>
</application>
</system.runtime.remoting>
</configuration>
Mode=Singleton
意味着对象服务所有客户端的单个实例。type="UsersNamespace.UserClass
- 格式为 namespace.class.assembly。objectUri="Users.rem"
- 必须是 .rem 或 .soap。
注意:另一种模式是 Singlecall
,这意味着每次客户端使用时都会创建一个新的对象实例。
如何从客户端调用远程对象
添加对远程对象的引用。
UserClass obj =
(UserClass)Activator.GetObject(typeof(UserClass),
"https:///Users/Users.rem");
return obj.GetUsers(User);
typeof(UserClass)
- 对象类型。http:///Users/Users.rem
- 远程对象。
IIS 设置
在 C:\interup\wwwroot 中创建一个新目录。我们称之为“Users”。
此目录包含:bin 目录(包含 User.dll 对象)和 web.config 文件。
使用默认值完成向导。然后,您的对象将被托管在 IIS 上。
开发 Windows 服务
问题:安排一个任务。基于时间限制。将用户从数据库填充到上述远程对象。
解决方案:开发一个 Windows 服务。
利用事件日志
public MyNewService()
{
InitializeComponent()
if(!System.Diagnostics.EventLog.SourceExists("DoDyLogSourse"))
System.Diagnostics.EventLog.CreateEventSource("DoDyLogSourse",
"DoDyLog");
eventLog1.Source = "DoDyLogSourse";
// the event log source by which
//the application is registered on the computer
eventLog1.Log = "DoDyLog";
}
使用 System.Timers.Timer
组件。
警告:使用组件计时器而不是窗体计时器。
- 在
Onstart
事件中添加计时器启动。protected override void OnStart(string[] args) { this.timer1.Start(); }
- 在
Onstop
事件中添加计时器停止。protected override void OnStop() { this.timer1.Stop(); }
- 在
OnContinue
事件中添加计时器启动。protected override void OnContinue() { this.timer1.Start(); }
- 在
timer1_Elapsed
事件下添加填充用户的所需代码。
构建服务项目
- 在解决方案资源管理器中,右键单击您的项目,然后从快捷菜单中选择“属性”。将出现项目的属性页对话框。
- 在左侧窗格中,在“通用属性”文件夹中选择“常规”选项卡。
- 从“启动对象”列表中,选择“MyNewService”。单击“确定”。
- 按 Ctrl+Shift+B 构建项目。
项目构建完成后,即可部署。安装项目将安装编译后的项目文件,并运行运行 Windows 服务所需的安装程序。要创建完整的安装项目,您需要将项目输出 MyNewService.exe 添加到安装项目中,然后添加自定义操作以安装 MyNewService.exe。
创建服务的安装项目
- 在“文件”菜单上,指向“添加项目”,然后选择“新建项目”。
- 在“项目类型”窗格中,选择“安装和部署项目”文件夹。
- 在“模板”窗格中,选择“安装项目”。将项目命名为 MyServiceSetup。
已将安装项目添加到解决方案。接下来,您将把 Windows 服务项目 MyNewService.exe 的输出添加到安装程序中。
将 MyNewService.exe 添加到安装项目
- 在解决方案资源管理器中,右键单击 MyServiceSetup,指向“添加”,然后选择“项目输出”。将出现“添加项目输出组”对话框。
- MyNewService 在“项目”框中被选中。
- 从列表框中选择“主输出”,然后单击“确定”。
MyNewService 的主输出的项目项已添加到安装项目中。现在,添加一个自定义操作以安装 MyNewService.exe 文件。
向安装项目添加自定义操作
- 在解决方案资源管理器中,右键单击安装项目,指向“视图”,然后选择“自定义操作”。将出现“自定义操作”编辑器。
- 在“自定义操作”编辑器中,右键单击“自定义操作”节点,然后选择“添加自定义操作”。将出现“在项目中选择项”对话框。
- 双击列表框中的应用程序文件夹将其打开,选择 MyNewService 的主输出(Active),然后单击“确定”。主输出已添加到自定义操作的四个节点 — Install、Commit、Rollback 和 Uninstall。
- 生成安装项目。
安装 Windows 服务
浏览到保存安装项目的目录,然后运行 .msi 文件来安装 MyNewService.exe。
启动和停止服务
- 通过执行以下操作之一打开服务控制管理器:
- 在 Windows 2000 Professional 中,右键单击桌面上的“我的电脑”,然后单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。
- 或 -
- 在 Windows 2000 Server 中,单击“开始”,指向“程序”,单击“管理工具”,然后单击“服务”。
注意:在 Windows NT 4.0 中,您可以从控制面板打开此对话框。
- 在 Windows 2000 Professional 中,右键单击桌面上的“我的电脑”,然后单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。
- 此时,您应该会在窗口的“服务”部分看到列出的 MyNewService。
- 在列表中选择您的服务,右键单击它,然后单击“启动”。
右键单击服务,然后单击“停止”。
验证服务的事件日志输出
打开服务器资源管理器并访问“事件日志”节点。有关更多信息,请参阅《服务器资源管理器中事件日志的使用》。
注意:在 Visual Basic 和 Visual C# .NET 的标准版中,“服务器资源管理器”的“服务器”节点不可用。
卸载服务
- 在“开始”菜单上,打开“控制面板”并单击“添加/删除程序”,然后找到您的服务并单击“卸载”。
- 您也可以通过右键单击 .msi 文件的程序图标并选择“卸载”来卸载程序。