对Cache的ECP,及ECP和小机关系很多人有误区,今天谈谈ECP一些理解。
1.改M代码在任意ECP和小机都一样,任意地方改了,其他地方都能及时看到更新,所以开发改M时候可以开任意ECP和小机。
2.临时Global不会在ECP之间和小机同步,属于各自服务器的。所以在后台记录调试参数时要确认网站连接的数据库,如果不清楚可以用非临时Global记录参数。否则就存在记录参数没记录到,然后说问题奇怪。所以写临时Global逻辑的死循环会让执行逻辑的ECP的磁盘写满,没执行死循环逻辑的服务器不受影响。
3.csp文件和js及html等代码不属于Cache的M系列,因此这些文件的修改要开主Web(即文件同步的源头)。如果给开发改代码不开主Web,那么改的csp、js、html等不会同步到其他ECP服务器,且可能在后面源头文件再改之后被同步覆盖而丢失代码。
4.如果不考虑ECP服务器Web连数据库影响,可以重启和停止ECP上的数据库,停ECP不会影响到小机和其他ECP(可以停ECP换空的CacheTMP库)。
5.ECP自己本地并没有数据库文件,是通过映射远程数据库的。
6.程序对空Global访问在ECP和小机性能不是一个数量级。所以开发应该避免空Global的出现。特别是多次使用的Global,比如查询工作列表逻辑里存在用到空Global的情况会造成奇慢的效果。
造成ECP访问不存在Global的原因应该是Cache的一个bug。由于Global不存在。每次代码调用ECP会向小机请求该数据,正常存在的Global就获取到ECP本地了。然后后面逻辑就在ECP本地判断完成了。而不存在的GlobalECP向小机请求之后也是没数据,所以ECP本地没有保存。然后就每次使用都尝试向小机请求。就变成了无数次的ECP和小机的TCP操作了。这种清空Cache应该记录个标识,是否向小机确认过Global是否存在,不存在的就不每次向小机请求就可以解决。
测试使用不存在和存在的Global
Class OTH.ECPTest Extends (%RegisteredObject, %XML.Adaptor)
{
/// 测试空global在ECP和小机的性能
/// d ##Class(OTH.ECPTest).NullGlobalTest()
ClassMethod NullGlobalTest()
{
s info="开始时间:"_$zt($p($h,",",2))
k ^NotExitGlobal
zw info
s StartTime=$p($h,",",2)
f i=1:1:100000 d
.i $d(^NotExitGlobal("1")) d
..w "空"
s info="结束时间时间:"_$zt($p($h,",",2))
zw info
s info="执行耗时:"_($p($h,",",2)-StartTime)_"秒"
zw info
q ""
}
/// 测试非空global在ECP和小机的性能
/// d ##Class(OTH.ECPTest).NotNullGlobalTest()
ClassMethod NotNullGlobalTest()
{
s info="开始时间:"_$zt($p($h,",",2))
zw info
s ^NotExitGlobal=""
s StartTime=$p($h,",",2)
f i=1:1:100000 d
.i $d(^NotExitGlobal("1")) d
..w "空"
s info="结束时间时间:"_$zt($p($h,",",2))
zw info
s info="执行耗时:"_($p($h,",",2)-StartTime)_"秒"
zw info
q ""
}
}
在ECP上执行$d不存在的Global10000次耗时15秒,存在的Global耗时0秒
DHC-LISDATA>d ##Class(OTH.ECPTest).NullGlobalTest()
info="开始时间:13:21:43"
info="结束时间时间:13:21:58"
info="执行耗时:15秒"
DHC-LISDATA>d ##Class(OTH.ECPTest).NotNullGlobalTest()
info="开始时间:13:22:02"
info="结束时间时间:13:22:02"
info="执行耗时:0秒"
DHC-LISDATA>
M得到调用数据库客户端的IP
/// 得到通过webservice调用的客户端IP
/// w ##Class(LIS.Util.Common).GetClientIP()
ClassMethod GetClientIP()
{
q $zutil(67,15,$j)
}
M得到执行服务器的IP
/// 得到通过当前M执行的服务器IP
/// w ##Class(LIS.Util.Common).GetServerIP()
ClassMethod GetServerIP()
{
q $p($zu(54,13,$zu(54,0)),",")
}
zlz 20220312