server5.htm
1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<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>