4fea4bea671007075d2f32c21a4b1b2a94de532a.svn-base 1.88 KB
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
</head>
<body bgcolor=#ffffff vlink=#0000ff>

<div id="Tag1"/>
<br>
  <font style='font-size:15pt'>4.线程模型</font><hr color=#2266ee size=1>
  在前面的接口说明中我们提到过 GetActiveServices( ) 函数,该函数返回的是当前工作<b>进程</b>中已经开启的报表服务<b>线程</b>数量。在通常情况下,我们都要求保持单线程运行:<br>
<pre class='cpp'>
..
if(dll.GetActiveServices( ) > 0) {
 Response.Write("服务器忙,请稍后再试");
 Response.End();
 return;
}
..</pre>
  如果您将这段判断语句删除或注释掉,相当于就允许多线程工作了,也即允许同时启动多个报表服务,您会发现服务仍然能运行,貌似挺正常。<br>
  但是实际上还是有问题的,我们程序内部为了保证系统的稳定性,对调用 func 函数的这一过程实行了线程堵塞:同一时刻只允许一个线程工作访问 func 函数,待 func 返回,再允许其它线程调用 func,原理图如下:
<center><img src='server3.png'></center>
  您看出问题来了吗?简单举个例子吧,假如同时有5个登录用户打开了报表服务,如果第一个用户访问的func函数碰巧很费时,那么其它4个用户也得老老实实地排队等待着。<br>
<br>
  如果您希望这5个用户都能各自独立、互不影响地访问报表服务,请使用下面的“进程模型”。<br>
<br>
<br>
<div id="Tag2"/>
<br>
  <font style='font-size:15pt'>5.进程模型</font><hr color=#2266ee size=1>
  要彻底让每个登录用户都互不牵制、独立工作,请在IIS中将应用程序池配置成一个Web园(Web Garden),即允许多进程工作,以提高报表服务的并发吞吐量.<br>
  配置方法很简单,在 IIS 的“应用程序池”中,找到硕正服务所在的程序池(如果不存在就创建一个),在“高级设置”中,将最大工作进程数从默认的“1”改成多个:<br>
<center><img src='server4.png'></center>
  例如设成“5”,就表示同时能容纳5个并发用户工作,这一点我们已经实际验证过。<br>
  设成Web园还有一个好处: 万一某个进程崩溃,也不影响其它访问者。<br>


<br><br><br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>