2014-05-02 64 views
0

我在cfwheels中遇到了一些併發問題。onRequestStart CFWheels

我對事件的一些代碼/ 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)> 

所以,我想我的問題是,如何避免這種情況發生?

回答

6

1)適用範圍是「應用廣泛」(所有網站的廣大用戶) - 你不應該按照用戶設置有設置,永遠,因爲你已經發現,用戶B將覆蓋用戶A使用會話範圍爲每個用戶的東西。因此,在最後兩行中,您將使用會話範圍數據設置應用程序範圍內的東西!

2)作爲一個側面說明,在車輪可以用application.wheels.datasourcename得到數據庫名稱

+0

只是爲了確保我明白你什麼建議,從onRequestStart更改代碼的位置onSessionStart,也從應用程序中更改變量的名稱。*會話。*? – Geo

+0

沒有看到更大的代碼,我不能太具體;請記住,onSessionStart將啓動匿名會話 - 所以用戶第一次進入該網站(在他們登錄之前)。如果此信息用於已驗證的用戶,則您希望在登錄時將該用戶的特定數據複製到會話範圍中。這可能是因爲您有應用程序範圍中的數據副本,緩存等 - 這很好;但將應用程序級別的數據視爲永遠不會/很少更改的東西。看看http://github.com/neokoenig/RoomBooking的例子。 – Neokoenig

0

我把這些代碼到一個功能控制器(controller.cfc)內,並使用過濾器運行。

看到:http://cfwheels.org/docs/1-1/chapter/filters

這對我的工作沒有問題了類似的任務。

也因爲其中的項目越來越混淆這很可能我會刪除任何參考application.。把這些功能的正確位置是進當然這是events/functions.cfm

沒有看到您的更多的代碼...

0

正如Neokoenig提到的,你是利用共享的範圍,以存儲用戶特定的數據,你應該將其存儲在SESSION中。如果您需要應用程序範圍中的數據,則應該在設置數據時使用鎖定,但看起來您應該在onSessionStart中運行一次,而不是在每次請求中執行此操作。如果需要在每個請求上運行它,則可能需要繼續使用onRequestStart,但要使用特定於用戶的會話存儲而不是全局應用程序層。

只需記住: Application變量將顯示相同的數據的所有用戶。因此,如果用戶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)