Cache数据库ECP梳理

对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>


在小机执行就没有差别
Cache数据库ECP梳理_第1张图片

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

你可能感兴趣的:(Caché,服务器,运维)