服务器结构中的空零错误



我有一个服务器变量,一个结构的结构,所有用户都高度访问了(并发)。添加值并非常频繁地删除值。这是我的服务器变量的一个小示例。真正的数据有更多的数据。

<cfset SERVER.structure = StructNew()>
<cfset s = StructNew()>
<cfset StructInsert(s, 'test11', 'value11', true)>
<cfset StructInsert(s, 'test12', 'value12', true)>
<cfset StructInsert(SERVER.structure, 'test1', s, true)>
<cfset s = StructNew()>
<cfset StructInsert(s, 'test21', 'value21', true)>
<cfset StructInsert(s, 'test22', 'value22', true)>
<cfset StructInsert(SERVER.structure, 'test2', s, true)>

每隔几个小时,我就会循环使用此结构以清洁过期的数据。但是,在这样的变量循环时,我会遇到错误" null null":

<cfloop collection="#SERVER.structure#" item="key">
    <cfif StructKeyExists(SERVER.structure, key)>
        <cfloop collection="#StructFind(SERVER.structure, key)#" item="key2">
            <!--- And some code here --->
        </cfloop>
    </cfif>
    <cfif StructCount(StructFind(SERVER.structure, key)) eq 0>
        <cfset StructDelete(SERVER.structure, key, false)>
    </cfif>
</cfloop>

我在示例的第一行中收到错误。在这一行中,

<cfloop collection="#SERVER.structure#" item="key">

所以我尝试了另一种方法。我没有一个一个键,而是创建了一系列键并将其循环。不幸的是,在此确切行中,"零空"错误也发生了:

<cfset arrayOfKeys = StructKeyArray(SERVER.structure)>

我的第一个理论是ColdFusion无法处理该服务器变量所具有的并发级别。我试图在此处使用<cflock>,同时清除变量,但也没有起作用。而且我无法拥有此<cflock>,因为用户实际上使用和修改了该变量,因为它会添加的额外负载(我相信)。

我不知道...我没有想法。现在有没有人发生这种情况或以前遇到了这个问题?解决这个问题的解决方案或解决方法,甚至是使我的代码更好的建议也非常受欢迎。

非常感谢。

我在清除变量时尝试在这里使用<cflock>,但是 也没有工作。而且我不能将这个<cflock>在变量 由于额外的负载,用户实际上被用户使用和修改 它会添加(我相信)。

这是您的问题。如果您使用的是服务器范围,则必须必须锁定所有对其的访问(读写)。否则,您会遇到错误。那是长时间的。

我的第一个理论是ColdFusion无法处理该服务器变量的并发级别

好:不。ColdFusion将将单个操作同步到服务器范围(好:它在Java级别处理),这就是其工作开始和结束的地方。只是您的方法无法处理它。也就是说,您不采取步骤来减轻自己的代码中的比赛条件。您的这一主张:

当我使用变量时,我不会锁定访问权限,因为碰撞不会发生

完全是错误的。循环中有种族条件。

正如其他人所暗示的那样,这是非常差的应用架构,并且代码很容易。

只需将数据放在数据库中即可。这就是数据库的目的,并且它们以一种方式编写了一种方式,以优化您试图(但显然不是成功)来实现的操作。

我认为这可能是一个过早优化的情况:您是否将这些数据放在适当的配置和设计的DB中?还是您第二次猜测这将是一个问题?我怀疑这是后者。或DB服务器未正确配置。

在数据库层上,您也可以像其他人一样使用缓存层。

,但只是不像其他人所说的那样重新发明轮子。

您问题的最重要的答案是,您正在遇到错误,因为您无法正确锁定数据,并且您的代码中有竞赛条件,使ColdFusion试图访问您告诉您的数据,但随后可以改变。这是由于您的代码,而不是ColdFusion的缺点。

相关内容

  • 没有找到相关文章

最新更新