65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (6投票s)

2003年11月5日

4分钟阅读

viewsIcon

82333

downloadIcon

488

如何创建共享对象,然后从内存而不是数据库读取它

IIS 上的远程对象

问题:有时我们需要从数据库中获取相同的、不变的集合数据,例如用户、城市、国家等。如何避免重复访问数据库,以提高服务器性能?

解决方案:使用由 IIS 托管的 .NET Remoting Singleton 对象。这样,该对象将在所有应用程序之间共享。一个程序可以运行为服务,将数据从数据库填充到该对象中。其他应用程序可以从 IIS 访问此对象(参见下图)。

让我们以(针对用户)以下示例为例。

远程对象生命周期

InitializeLifetimeServiceMarshByREfObejct 继承(请参阅下面的代码)。

// 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 事件下添加填充用户的所需代码。

构建服务项目

  1. 在解决方案资源管理器中,右键单击您的项目,然后从快捷菜单中选择“属性”。将出现项目的属性页对话框。
  2. 在左侧窗格中,在“通用属性”文件夹中选择“常规”选项卡。
  3. 从“启动对象”列表中,选择“MyNewService”。单击“确定”。
  4. 按 Ctrl+Shift+B 构建项目。

项目构建完成后,即可部署。安装项目将安装编译后的项目文件,并运行运行 Windows 服务所需的安装程序。要创建完整的安装项目,您需要将项目输出 MyNewService.exe 添加到安装项目中,然后添加自定义操作以安装 MyNewService.exe

创建服务的安装项目

  1. 在“文件”菜单上,指向“添加项目”,然后选择“新建项目”。
  2. 在“项目类型”窗格中,选择“安装和部署项目”文件夹。
  3. 在“模板”窗格中,选择“安装项目”。将项目命名为 MyServiceSetup

已将安装项目添加到解决方案。接下来,您将把 Windows 服务项目 MyNewService.exe 的输出添加到安装程序中。

将 MyNewService.exe 添加到安装项目

  1. 在解决方案资源管理器中,右键单击 MyServiceSetup,指向“添加”,然后选择“项目输出”。将出现“添加项目输出组”对话框。
  2. MyNewService 在“项目”框中被选中。
  3. 从列表框中选择“主输出”,然后单击“确定”。

MyNewService 的主输出的项目项已添加到安装项目中。现在,添加一个自定义操作以安装 MyNewService.exe 文件。

向安装项目添加自定义操作

  1. 在解决方案资源管理器中,右键单击安装项目,指向“视图”,然后选择“自定义操作”。将出现“自定义操作”编辑器。
  2. 在“自定义操作”编辑器中,右键单击“自定义操作”节点,然后选择“添加自定义操作”。将出现“在项目中选择项”对话框。
  3. 双击列表框中的应用程序文件夹将其打开,选择 MyNewService 的主输出(Active),然后单击“确定”。主输出已添加到自定义操作的四个节点 — InstallCommitRollbackUninstall
  4. 生成安装项目。

安装 Windows 服务

浏览到保存安装项目的目录,然后运行 .msi 文件来安装 MyNewService.exe

启动和停止服务

  1. 通过执行以下操作之一打开服务控制管理器:
    • 在 Windows 2000 Professional 中,右键单击桌面上的“我的电脑”,然后单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。

      - 或 -

    • 在 Windows 2000 Server 中,单击“开始”,指向“程序”,单击“管理工具”,然后单击“服务”。

    注意:在 Windows NT 4.0 中,您可以从控制面板打开此对话框。

  2. 此时,您应该会在窗口的“服务”部分看到列出的 MyNewService
  3. 在列表中选择您的服务,右键单击它,然后单击“启动”。

右键单击服务,然后单击“停止”。

验证服务的事件日志输出

打开服务器资源管理器并访问“事件日志”节点。有关更多信息,请参阅《服务器资源管理器中事件日志的使用》。

注意:在 Visual Basic 和 Visual C# .NET 的标准版中,“服务器资源管理器”的“服务器”节点不可用。

卸载服务

  • 在“开始”菜单上,打开“控制面板”并单击“添加/删除程序”,然后找到您的服务并单击“卸载”。
  • 您也可以通过右键单击 .msi 文件的程序图标并选择“卸载”来卸载程序。
© . All rights reserved.