我在cf轮上遇到了一些并发问题。
我在events/onrequeststart.cfm中有一些代码,每次用户请求时都会执行这些代码。
测试用例:用户A-请求时间:10秒用户B-请求时间:2秒
如果用户B在用户A已经在处理请求时发出请求,则用户的B设置将进入用户A,用户A将根据用户的B请求显示结果。
我试着在onrequeststart.cfm上使用cflock,但它似乎不起作用。我对车轮没有太多的经验,所以我可能尝试做一些逻辑错误的事情。
这是引起混淆的代码的一部分。
<cfquery name="currentUser" datasource="#application.ds#">
select * from clientadmin where clientAdminid ='#session.clientadminid#'
</cfquery>
<cfquery name="currentClient" datasource="#application.ds#">
select * from clientBrands where clientbrandID ='#currentUser.ClientBrandID#'
</cfquery>
<cfset application.clientAdminSurveys = application.generalFunctions.clientSurveys(clientAdminID=session.clientAdminID, clientBrandID = currentUser.clientBrandID)>
<cfset application.AssociatedDoctors = application.generalFunctions.AssociatedDoctors(clientAdminID=session.clientAdminID, clientBrandID = currentUser.clientBrandID)>所以,我想我的问题是,如何避免这种情况发生?
发布于 2014-05-03 09:23:50
1)应用程序作用域是“应用程序范围”(站点范围内的所有用户)--您不应该设置每个用户的设置,正如您已经发现的那样,用户B覆盖用户A。为每个用户的内容使用会话范围。因此,在最后两行中,您将使用会话范围数据来设置应用程序作用域!
2)顺便提一句,在轮子中,您可以使用application.wheels.datasourcename获取数据库名称
发布于 2014-06-09 17:10:40
我会将该代码放入控制器(controller.cfc)中的一个函数中,并使用过滤器运行它。
请参阅:http://cfwheels.org/docs/1-1/chapter/filters
这对我来说是有效的,没有类似任务的问题。
另外,我会删除对application.的任何引用,因为这很可能是项目混淆的地方。将这些函数放入events/functions.cfm中的正确位置
当然没有看到更多你的代码..。
发布于 2015-02-19 21:05:05
正如Neokoenig所提到的,您正在使用共享范围存储特定于用户的数据,您应该在会话中存储这些数据。如果您需要应用程序范围中的数据,您应该在设置数据时使用锁,但是看起来您应该在onSessionStart中运行一次,而不是在每个请求上运行。如果您需要对每个请求运行它,您可能希望继续使用onRequestStart,但使用特定于用户的会话存储,而不是全局应用程序层。
请记住:应用程序变量将为所有用户显示相同的数据。因此,如果用户a设置application.foo =1,用户b设置application.foo = 2,那么用户1将尝试访问application.foo,用户1将看到用户2的值2。如果使用会话范围,则不会出现相同的问题。如果用户1设置SESSION.foo =1,用户2设置SESSION.foo =2。当用户访问SESSION.foo变量时,它将只包含该用户设置的数据集(例如:用户1将输出SESSION.foo并查看值,1)
https://stackoverflow.com/questions/23437599
复制相似问题