0

我在 cfwheels 中遇到了一些并发问题。

我在 events/onrequeststart.cfm 中有一些代码,每次用户请求某些东西时都会执行这些代码。

测试用例:用户 A - 请求时间:10 秒用户 B - 请求时间:2 秒

如果用户 B 在用户 A 已经在处理请求时发出请求,则用户 B 的设置将进入用户 A,并且用户 A 将根据用户 B 的请求显示结果。

我尝试在 onrequeststart.cfm 上使用 cflock,但它似乎不起作用。我对 cfwheels 没有太多经验,所以我可能会尝试做一些逻辑上错误的事情。

这是混淆的代码的一部分。

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

所以,我想我的问题是,如何避免这种情况发生?

4

3 回答 3

6

1)应用程序范围是“应用程序范围”(站点范围内的所有用户) - 您不应该在那里设置每个用户设置,正如您所发现的那样,用户 B 会覆盖用户 A。使用会话范围用户的东西。因此,在最后两行中,您正在使用会话范围数据设置应用程序范围的内容!

2) 作为旁注,您可以在轮子中使用 application.wheels.datasourcename 来获取数据库名称

于 2014-05-03T09:23:50.927 回答
0

我会将该代码放入控制器(controller.cfc)内的一个函数中,并使用过滤器运行它。

见:http ://cfwheels.org/docs/1-1/chapter/filters

这对我有用,没有类似任务的问题。

此外,我会放弃任何参考,application.因为这很可能是项目混淆的地方。放置这些功能的正确位置是events/functions.cfm

当然这是没有看到更多你的代码......

于 2014-06-09T17:10:40.083 回答
0

正如 Neokoenig 所提到的,您正在使用共享范围来存储用户特定的数据,您应该将其存储在 SESSION 中。如果您需要应用程序范围内的数据,您应该在设置该数据时使用锁,但看起来您应该在 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)

于 2015-02-19T21:05:05.827 回答