📄 在电子商务环境中通过使用对象池获得可伸缩性.htm
字号:
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P><B>SetAbort</B> 方法发出信号表示您已经完成而且注定中止当前事务。它设置完成位为 TRUE,一致位为 FALSE。
</P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P><B>EnableCommit</B> 方法发出信号表示您还没有完成但是表决提交事务。它设置完成位为 FALSE,一致位为 TRUE。
</P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P><B>DisableCommit</B>
方法发出信号表示您还没有完成而且表决现在不提交事务,通常是因为状态不一致。它设置完成位为FALSE,一致位为 FALSE。
</P></TD></TR></TBODY></TABLE>
<P>服务器 C++ 代码可能如下例所示:</P><PRE class=codeSample>HRESULT MyObject::Method1()
{
. . .
IObjectContext *pObjectContext;
hr = GetObjectContext(&pContextState);
if (FAILED(hr))
return hr;
hr = PersistToSomething(); // Try to store something
if (SUCCEEDED(hr))
{
if (bDone) // Is the object able to be
// deactivated?
{
pObjectContext->SetComplete();
}
else
{
pObjectContext->EnableCommit();
}
}
else
{
if (bDone) // Is the object able to be
// deactivated?
{
pObjectContext->SetAbort();
}
else
{
pObjectContext->DisableCommit();
}
}
return S_OK;
}
</PRE>
<H3>使用 Auto-Done 属性</H3>
<P>您可以管理性地配置方法,这样对象将自动地在方法返回时变成停用。<B>Auto-Done</B> 属性在<B> Component Services
</B>管理工具中是以 <B>Automatically deactivate this Object when this method returns</B>
的形式出现的。当您选择这个复选框后,调用该方法时完成位的默认设置就被更改为 TRUE。注意,这可能很危险,所以使用 <B>Auto-Done
</B>属性应该小心。</P>
<P>如果您选中了 <B>Auto-Done</B>,然后没有进行操作设置完成位,它在方法返回时将为 TRUE,而 COM+
将停用对象。通过选择这个选项,您可以消除表决事务中重复的方法调用:因为一致位的默认设置为 TRUE,而您已经将完成位也更改为 TRUE
了,如果您没有进行操作更改这些设置,将自动调用 <B>SetComplete</B>。 </P>
<P>不过,对此行为有一个警告。COM+ 将检查方法返回的 HRESULT。如果 HRESULT 指示失败,一致位将设置为 FALSE,就好像您调用了
<B>SetAbort</B>。总之,如果您为方法选择了 <B>Auto-Done</B>,没有设置任何位,并且返回一个 HRESULT hr ,那么:
</P>
<TABLE border=0 cellPadding=0 cellSpacing=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>如果 SUCCEEDED(hr),就好像您调用了 <B>SetComplete</B>。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>如果 FAILED(hr),就好像您调用了 <B>SetAbort</B>。 </P></TD></TR></TBODY></TABLE>
<P>启用 <B>Auto-Done </B>时,您更改了该方法 JIT
激活和自动事务的默认行为。您可能想使用这一功能,因为它消除了显式声明一致性和完成情况的需要,这也可以通过在启用 <B>Auto-Done</B> 时,只返回一个
HRESULT 实现。</P>
<P>要为方法启用 <B>Auto-Done</B>: </P>
<TABLE border=0 cellPadding=0 cellSpacing=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>在<B> Component Services </B>管理工具的详细信息窗格中,右击您想要配置的方法,然后单击
<B>Properties</B>。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>在方法属性对话框中单击 <B>General</B> 选项卡。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>要启用 <B>Auto-Done</B>,选中 <B>Automatically deactivate this object when
this method returns </B>复选框如图 6 所示。如果复选框不可用,您必须首先为组件启用 JIT 激活。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>单击 <B>OK</B>。 </P></TD></TR></TBODY></TABLE>
<DIV style="WIDTH: 416px"><IMG alt=scalobjpool6.gif border=0 height=462
src="在电子商务环境中通过使用对象池获得可伸缩性.files/scalobjpool6.gif" width=416><BR>
<P class=figureCaption><B>图 6. 使用组件服务资源管理器在方法中启用 Auto-Done</B></P>
<DIV class=figureRule></DIV></DIV>
<DIV style="MARGIN-BOTTOM: 10px; MARGIN-TOP: 3px"><A
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top"><IMG
alt=返回页首 border=0 height=9 src="在电子商务环境中通过使用对象池获得可伸缩性.files/arrow_px_up.gif"
width=7></A><A class=topOfPage
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top">返回页首</A></DIV><A
name=XSLTsection125121120120></A>
<H2>对象池和性能</H2>
<P>对象池在一些情况下可以极为高效,能够实质性地提高性能。为了重用对象以达到最佳利用,您应该尽可能多地池化资源,将初始化和实际执行的工作区分开来,然后根据部署时硬件的实际情况管理性地调整池的特性。这涉及到:
</P>
<TABLE border=0 cellPadding=0 cellSpacing=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>编写对象以将昂贵的初始化和资源获取分离出来,这对于任何客户端而言都是执行实际工作的前提条件。您应该编写比较大的对象构造函数,尽可能多地池化资源,这样在当客户端从池中获得一个对象时,资源可以被对象拥有并立即可用。
</P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>管理性地配置池,从而在可用硬件资源(通常是在专门用来维护一定大小的池的内存)与客户端访问和使用对象能够更快之间取得最佳平衡。在一定的点上,池将会出现收益递减,这时限制特定组件可能使用的资源,可以获得足够好的性能。
</P></TD></TR></TBODY></TABLE>
<DIV style="MARGIN-BOTTOM: 10px; MARGIN-TOP: 3px"><A
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top"><IMG
alt=返回页首 border=0 height=9 src="在电子商务环境中通过使用对象池获得可伸缩性.files/arrow_px_up.gif"
width=7></A><A class=topOfPage
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top">返回页首</A></DIV><A
name=XSLTsection126121120120></A>
<H2>通过池管理机制管理资源的使用</H2>
<P>您可以使用池的最大大小非常精确地管理资源的使用方式。例如,如果您许可一定数量的数据库连接,就可以控制在任何时候打开连接的数量。 </P>
<P>考虑一下客户端的使用模式、对象使用的特性和物理资源(如内存和连接),您可能在进行性能优化时,发现某种最佳的平衡。池化对象将在达到一定的点后出现收益递减。您可以决定需要什么级别的性能,再平衡获得这种性能所必要的资源。通过池,您可以对资源的使用进行很好地控制。
</P>
<P>当您配置对象池的时候,为了有助于性能优化,可以监视应用程序中组件的对象统计信息。 </P>
<DIV style="MARGIN-BOTTOM: 10px; MARGIN-TOP: 3px"><A
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top"><IMG
alt=返回页首 border=0 height=9 src="在电子商务环境中通过使用对象池获得可伸缩性.files/arrow_px_up.gif"
width=7></A><A class=topOfPage
href="http://www.microsoft.com/china/msdn/library/windev/componentdev/CDscalobjpool.mspx#top">返回页首</A></DIV><A
name=XSLTsection127121120120></A>
<H2>构造字符串</H2>
<P>您可以管理性地为组件指定构造函数字符串,从而针对给定任务对组件进行定制。在组件已经专门编写为可以识别您输入的字符串时您可以这样做。</P>
<P>对象构造函数字符串是一些管理性地为组件指定的初始化字符串。当组件专门编写为可以识别您输入的字符串时,您就可以指定构造函数字符串。可以通过编程让组件使用
<B>IObjectConstruct</B> 访问这些字符串。</P>
<P>只有在启用了对象构造的情况下,构造函数字符串才可以在对象创建时传递。注意空字符串也可能是合法的输入。 </P>
<H3>为组件输入对象构造函数字符串</H3>
<P>对象构造函数字符串是 COM+
支持泛型编程的一种功能。您可以编写一个带有一定程度通用性的组件,它可以使用管理性指定的构造函数字符串为特定的任务自定义;也就是说,您可以执行参数化的对象构造。
</P>
<P>例如,您可以使用这一功能编写拥有通用 ODBC 连接的组件,然后管理性地为组件指定一个确切的 DSN。如果系统配置更改了,您可以相应地更改构造函数字符串。
</P>
<P>当管理性地为您的组件启用对象构造时,COM+ 将调用它实现的 <B>IObjectConstruct::Construct</B>
方法。在此方法内,您可以使用 <B>IObjectConstructString </B>访问构造函数字符串。 </P>
<P>要为组件输入对象构造函数字符串,可以: </P>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=numberedList>
<TBODY>
<TR vAlign=top>
<TD align=right class=listNumber noWrap>
<P>1.</P></TD>
<TD>
<P>在 Component Services 管理工具的详细信息窗格中,右击您想要配置的组件,然后单击 <B>Properties</B>。
</P></TD></TR>
<TR vAlign=top>
<TD align=right class=listNumber noWrap>
<P>2.</P></TD>
<TD>
<P>在组件属性对话框中单击 <B>Activation</B> 选项卡。 </P></TD></TR>
<TR vAlign=top>
<TD align=right class=listNumber noWrap>
<P>3.</P></TD>
<TD>
<P>要启用对象构造函数字符串,选中 <B>Enable object construction</B> 复选框。 </P></TD></TR>
<TR vAlign=top>
<TD align=right class=listNumber noWrap>
<P>4.</P></TD>
<TD>
<P>在 <B>Constructor string
</B>框中,输入构造字符串(例如,DSN=AccountingServer)。注意可以使用空字符串。
</P></TD></TR></TBODY></TABLE>
<P><B>IObjectContruct </B>和 <B>IObjectConstructString</B> 接口如表 1 和表 2 所示。</P>
<P><B>表 1. IObjectConstruct 接口</B></P>
<TABLE cellPadding=0 cellSpacing=0 class=dataTable
id=XSLTdataTable128124127121120120>
<THEAD>
<TR class=stdHeader vAlign=top>
<TD id=colXSLTfield120120128124127121120120>方法</TD>
<TD id=colXSLTfield121120128124127121120120
style="BORDER-RIGHT: #cccccc 1px solid">说明</TD></TR></THEAD>
<TBODY>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell><B>Construct</B></P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>当此功能管理性地启用时执行对象的构造,允许您为对象提供参数。</P></TD></TR></TBODY></TABLE>
<DIV class=dataTableBottomMargin></DIV>
<P><B>表 2. IObjectConstructString 接口</B></P>
<TABLE cellPadding=0 cellSpacing=0 class=dataTable
id=XSLTdataTable130124127121120120>
<THEAD>
<TR class=stdHeader vAlign=top>
<TD id=colXSLTfield120120130124127121120120>方法</TD>
<TD id=colXSLTfield121120130124127121120120
style="BORDER-RIGHT: #cccccc 1px solid">说明</TD></TR></THEAD>
<TBODY>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell><B>get_ConstructString</B></P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>获取管理性地为对象指定的构造函数字符串。</P></TD></TR></TBODY></TABLE>
<DIV class=dataTableBottomMargin></DIV>
<P>如下代码说明了如何通过实现 <B>IObjectConstruct::Construct </B>访问构造字符串:</P><PRE class=codeSample>STDMETHODIMP CMyObject::Construct(IDispatch * pUnk)
{
if (!pUnk)
return E_UNEXPECTED;
HRESULT hr;
IObjectConstructString * pString = NULL;
hr = pUnk-> QueryInterface(
IID_IObjectConstructString, (void **)&pString);
if (pString)
{
CComBSTR s;
pString -> get_ConstructString(&s);
. . .
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -