COM+系列——设计可伸缩的应用

原创 2004年07月07日 11:54:00

龙卷风

关键字:XML,HTTP,COM+

1.  伸缩性

伸缩性是衡量应用在同一时间内能够处理多少用户的尺度。也是反映应用程序能否满足重要应用的一个指标。

在你的应用程序中到底可以容纳多少用户,每个用户每隔多久向服务器提交一次请求,你的用户所处的位置,如局域网还是interner中。这些问题在设计应用的时候,你需要考虑。

在设计分布式应用之前,一个问题就是使用的协议。如DCOMHTTPMSMQ

DCOM的缺点是显著的。如不能穿越防火墙。不能利用基于请求的负载平衡技术,因而限制了并发用户的数量,还要对每台客户机进行大量的配置等等。

HTTP实现简单及各个平台的支持越来越受到欢迎。事实上,构建COM+体系结构是建立在下面这个基础之上的:一个应用必须使用HTTP来实现客户到服务的通信才能获得最大的伸缩性。

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

2.  实际的问题

经常我们会遇到这样的问题,如一个总店与多个分店的情况,要求每天分店将业务数据上传到总店。彼此相隔较远。

总店的环境:有自己的固定IP WEB服务器(或者没有固定IP)的,或者没有自己的服务器,仅仅有一个虚拟空间的网站。

分店的环境:可以通过拨号方式连接。

3.达到的要求

       总店每天可以通过网站及时的看到分店的情况。并且数据要做到本地保留。

4.常见的解决办法

最多的一种方式就是分店将数据导出成txt文件,拨号连接成功后,将txt传送到某个ftp目录或者发送到指定的Email里。总店手工接收或者程序接收后,再做处理。

        还有一种就是分店的数据库直接连接总店的数据库,做保存更新操作。

5.使用HTTPXML来实现

       就是客户端应用程序通过一个XML文档传递参数,向Web服务器提交一个HTTP请求。服务端使用一个Asp页面得到该参数,执行其方法,然后使用XMl文档向客户端返回数据。

先看看服务端ASP的代码:

1).从服务端返回数据

getinfo.asp(以流的方式返回记录集)

<%@ Language=VBScript %>

<%

set conn=Server.CreateObject("ADODB.connection")

conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("web.mdb")

 

  dim rs

  Set rs = Server.CreateObject("ADODB.Recordset")

  rs.open "select * from test",conn

  rs.save response,1

  rs.close

%>

这里说明一下:只要客户端在请求中发送了符合格式的XML文档,ASP中的RequestResponse对象就能工作。(这项技术只能在IIS5Windows 2000中以及各自的高版本中使用。)

在客户端使用vb

'引用microsoft activex data object 2.x library

引用microsoft XML,version2.0

Option Explicit

Private rs As ADODB.Recordset

'从远程数据库得到内容

Private Sub Command5_Click()

提交一个HTTP请求。

Set rs = New ADODB.Recordset

rs.Open "http://localhost/webxml/getinfo.asp"

Set DataGrid1.DataSource = rs

End Sub

 

2)单个记录提交到远程asp文件

Getsingleinfo.asp(数据增加并返回结果)

<%@ Language=VBScript %>

<%

'这里需要修改,返回客户的xml响应文档

Response.ContentType = "text/xml"

 

set conn=Server.CreateObject("ADODB.connection")

conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("web.mdb")

 

   dim xmldom

  ' set xmldom = Server.CreateObject("Microsoft.XMLDOM")

   set xmldom = Server.CreateObject("MSXML.DOMDocument")

   xmldom.load Request

 

   dim sid,name,price,catagory,pdate

   sid = xmldom.selectSingleNode("//项目编号").text

   name = xmldom.selectSingleNode("//项目名称").text

   price = xmldom.selectSingleNode("//价格").text

   catagory = xmldom.selectSingleNode("//种类").text

   pdate =xmldom.selectSingleNode("//发生日期").text

 

   dim strsql,retval

   on error resume next

   strsql="insert into test(sid,name,price,catagory,pdate) values('"& sid &"','"& name &"','"& price &"','"& catagory &"','"& pdate &"')"

   'response.write strsql

   conn.execute strsql

   if err.number=0 then

      retval="数据成功提交"

   else

      retval="数据提交失败,请检查你的数据"

   end if

  

   set xmldom = Nothing

   set conn=nothing

'下面的代码是将结果以xml形式返回

'需要加上<?xml version="1.0" encoding="gb2312"?>这句,否则无法返回中文

%>

<?xml version="1.0" encoding="gb2312"?>

<Response>

  <retval><%=retval%></retval>

</Response>

 

相应的客户端vb代码:

Private Sub Command3_Click()

  Dim httpRequest As MSXML.XMLHTTPRequest

  Set httpRequest = New MSXML.XMLHTTPRequest

  Dim StrXml As String

  '构造出要上传的XML串,这里节点使用中文

  StrXml = "<Request>" & _

           "<项目编号>" & Txtbh.Text & "</项目编号>" & _

           "<项目名称>" & Txtname.Text & "</项目名称>" & _

           "<价格>" & Txtprice.Text & "</价格>" & _

           "<种类>" & TxtCategory.Text & "</种类>" & _

           "<发生日期>" & Txtpdate.Text & "</发生日期>" & _

           "</Request>"

              

  httpRequest.Open "POST", "http://localhost/webxml/putsingleinfo.asp", False

 

  httpRequest.send StrXml

 

  '如果错误

  If httpRequest.Status <> 200 Then

    MsgBox httpRequest.statusText, , httpRequest.Status

    Exit Sub

  End If

 

  '以下是判断数据是否正确提交

  Dim strretval As String

  Dim ResponseXml As DOMDocument

  Set ResponseXml = New DOMDocument

  Set ResponseXml = httpRequest.ResponseXml

  strretval = ResponseXml.selectSingleNode("//retval").Text

  MsgBox strretval

End Sub

 

3)多条数据上传

putinfo.asp

<%@ Language=VBScript %>

<!--#include file="adovbs.inc"-->

<%

Response.ContentType = "text/xml"

 

set conn=Server.CreateObject("ADODB.connection")

conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("web.mdb")

 

  dim rs

  on error resume next

  Set rs = Server.CreateObject("ADODB.Recordset")

  dim xmldom

  ' set xmldom = Server.CreateObject("Microsoft.XMLDOM")

   set xmldom = Server.CreateObject("MSXML.DOMDocument")

   xmldom.load Request

 

   dim sid,name,price,catagory,pdate

   Set xmlNode = xmlDom.documentElement

   Set objRetValNode = xmlDom.documentElement

 

   For i = 0 To xmlNode.childNodes.length - 1

         sid =  xmlnode.childNodes(i).childNodes(0).Text

         name =  xmlnode.childNodes(i).childNodes(1).Text

         price =  xmlnode.childNodes(i).childNodes(2).Text

         catagory =  xmlnode.childNodes(i).childNodes(3).Text

         pdate =  xmlnode.childNodes(i).childNodes(4).Text

 

   strsql="insert into test(sid,name,price,catagory,pdate) values('"& sid &"','"& name &"','"& price &"','"& catagory &"','"& pdate &"')"

   'response.write strsql

   conn.execute strsql

   next

 

   if err.number=0 then

      retval="数据成功提交"

   else

      retval="数据提交失败,请检查你的数据"

   end if

  

   set conn=nothing

%>

<?xml version="1.0" encoding="gb2312"?>

<Response>

  <retval><%=retval%></retval>

</Response>

 

相应的vb客户端代码

Private Sub Command2_Click()

Dim rs1 As New ADODB.Recordset

rs1.CursorLocation = adUseClient

rs1.CursorType = adOpenKeyset

rs1.LockType = adLockBatchOptimistic

 

rs1.Open "select * from test", conn, adOpenDynamic, adLockPessimistic

 

'由于RequestXml所包含的东西过多,我们直接生成xml文件

'直接使用了数据库字段,没有使用中文命名

Dim strXML

Dim fm

strXML = "<xml>"

rs1.MoveFirst

Do While Not rs1.EOF

strXML = strXML & "<row>"

For Each fm In rs1.Fields

strXML = strXML & "<" & fm.name & ">" & fm.Value & "</" & fm.name & ">"

Next

strXML = strXML & "</row>"

rs1.MoveNext

Loop

strXML = strXML & "</xml>"

Set rs1 = Nothing

 

 

Dim httpRequest As New MSXML.XMLHTTPRequest

httpRequest.Open "POST", "http://localhost/webxml/putinfo.asp", False

httpRequest.send strXML

 

If httpRequest.Status <> 200 Then

    MsgBox httpRequest.statusText, , httpRequest.Status

    Exit Sub

End If

 

Set rs = New ADODB.Recordset

'重新加载

rs.Open "http://localhost/webxml/getinfo.asp"

Set DataGrid1.DataSource = rs

 

  '以下是判断数据是否正确提交

  Dim strretval As String

  Dim ResponseXml As DOMDocument

  Set ResponseXml = New DOMDocument

  Set ResponseXml = httpRequest.ResponseXml

  strretval = ResponseXml.selectSingleNode("//retval").Text

  MsgBox strretval

 

End Sub

 

结束语:

这个例子充分的体现了HTTPXML的优势。对于客户来说,可以订制自己的xml格式,清晰易懂。安全性大大的提高。而且可以在不同的应用服务器上加以扩展使用。

如果要提高性能和加大安全性,在服务端可以使用COM组件来扩展ASP,以达到最好的效果。

下载本例子的完整代码

COM+系列——设计可伸缩的应用

COM+系列——设计可伸缩的应用 龙卷风关键字:XML,HTTP,COM+1.  伸缩性伸缩性是衡量应用在同一时间内能够处理多少用户的尺度。也是反映应用程序能否满足重要应用的一个指标。在你的应用程序中...
  • xuehouniao
  • xuehouniao
  • 2005年02月25日 00:37
  • 642

数据库的伸缩性

我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。 首先刚开始,人不多,压力也不大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一个Server里,包括web server...
  • crazyhacking
  • crazyhacking
  • 2014年01月27日 18:06
  • 1593

可伸缩Web架构与分布式系统

开源软件近年来已变为构建一些大型网站的基础组件。并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露。这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件...
  • esoft_lsj
  • esoft_lsj
  • 2015年07月20日 20:17
  • 766

可伸缩右侧边栏导航菜单

体验效果:http://keleyi.com/keleyi/phtml/jqmenu/3.htm 完整代码: 侧边固定栏导航菜单-柯乐义 侧边固定栏导航菜单" /> 侧...
  • sweetyhyh
  • sweetyhyh
  • 2017年05月09日 15:54
  • 1111

Scala学习整理[第一章 可伸缩的语言]<Programming In Scala>

##回顾 之前通过实验楼的课程已经对scala语言有了初步的了解 ,做了一些运算/重载/函数式编程的小Demo .但是不少细节还是模糊的 ,刚好看到 **Programming In Scala** ...
  • u011858405
  • u011858405
  • 2016年12月28日 19:54
  • 127

可伸缩架构常用技术--数据切分

可伸缩性架构常用技术 ——之数据切分(Data Sharding/Partition) 1. 简介 本来想写一篇可伸缩性架构方面的文章,发现东西太多了,久久未能下笔,这里首先把大家最关注的数据切...
  • co0der
  • co0der
  • 2012年01月29日 15:30
  • 4634

CSS自动伸缩的文本输入框

CSS实现自动伸缩的文本输入框,鼠标点击的时候,文本框会自动伸长,不输入的时候恢复原样,能点小智能的感觉,希望大家喜欢。 自动伸缩的输入框 body{ background:#fff...
  • changwei07080
  • changwei07080
  • 2012年04月10日 14:41
  • 1543

EffectiveJava(34) -- 使用接口模拟可伸缩的枚举

~~使用可伸缩性枚举模式会导致扩展实例的元素是基本类型的实例 , 但是基本类型的实例却不是扩展类型的元素 , 这样得到的数据很是混乱 . 所以可伸缩性枚举模式是不被 Java 语言支持的 , 而且直至...
  • JacXuan
  • JacXuan
  • 2017年03月22日 23:31
  • 10395

Android自定义View系列之可伸缩的TextView

在写博客之前,告诉大家一个消息,我开通了自己的微信公众账号,如果你喜欢我的文章,希望关注我的微信公众号,我会定期与大家分享最新的博客文章,以及移动互联网最新动态。 我的微信公众号:yuanzeyao...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2015年10月13日 21:40
  • 10147

谈如何设计可伸缩的代码?

谈如何设计可伸缩的代码? 可以通过结果来论证和检验你的代码是否是可伸缩的,一般可伸缩的代码包括以下特征: 1.代码是分块的,如果是流程性的,那么就想pipline一样每个节点一个模块,这是在垂直方...
  • KuaiLeShiFu
  • KuaiLeShiFu
  • 2016年10月11日 18:53
  • 214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM+系列——设计可伸缩的应用
举报原因:
原因补充:

(最多只允许输入30个字)