2012-08-03 25 views
1

我有一個包含許多功能的組件「bulletin.cfc」。將cfc與coldfusion頁面中的線程一起使用

我的主頁有兩個使用cfthread標籤運行的線程。

來自.net我以爲我會創建組件的兩個instrances,並在每個線程中使用一個。這樣他們就不會彼此混淆,我不需要擔心在函數中加鎖。

<cfset bullObj = new bulletin()> 
<cfset bullObj2 = new bulletin()> 

這是正確的嗎?

編輯:

感謝您的答案至今,我仍然無法理解與此雖然發生了問題。我裏面有兩個單獨cfthread元素下面的代碼:

<cfset listCount = 1> 
    <cftry> 
    <cfquery name="ins" datasource="#datasourceVar#" > 
     INSERT INTO element_user_shown 
     (elementid, userid, date_shown) 
     (
     <cfloop list="#elementIDList#" index="lcv"> 
     SELECT #lcv#, #tmpuserid#, GETDATE() 
      <cfif listCount LT listlen(elementIDList)> 
       UNION ALL 
      </cfif> 
     <cfset listCount = listCount + 1> 
     </cfloop> 
     )    
    </cfquery> 

這將運行一個晚上約70000倍,但得到每次約3-4個錯誤。檢查的錯誤,它看起來像

 INSERT INTO element_user_shown 
         (elementid, userid, date_shown) 
         (

          SELECT 621, 267509, GETDATE() 

          UNION ALL 

          SELECT 586, 267509, GETDATE() 

          UNION ALL 

          SELECT 594, 267509, GETDATE() 

          UNION ALL 

          SELECT 613, 267509, GETDATE() 

          SELECT 622, 267509, GETDATE() 

          SELECT 599, 267509, GETDATE() 

          SELECT 602, 267509, GETDATE()        

         ) 
+0

你的'Bulletin.cfc'是否有狀態?如果沒有,並且函數中的所有變量都是正確的,則不需要它的另一個實例。 – Henry 2012-08-03 18:06:21

回答

1

你是正確的,你的情況是通過引用傳遞所以潛力可能是那裏有一個併發問題的SQL。但是,如果你的函數參數被正確地劃分了,並且你沒有改變屬性作爲​​實例的一部分(換句話說,這是一個接口而不是一個bean),你可以安全地重用同一個實例。每個函數調用都是它自己的作用域,並且函數調用的生命期內返回的變量。

+0

函數中的所有變量都是局部作用域的。我擔心同一時間進入同一個函數的兩個線程會改變同一個「本地」變量,如果只有一個組件的實例 – Omiron 2012-08-05 20:20:02

+0

正如亨利所說 - 如果按照您描述的方式使用它單身接口方法可以。 – 2012-08-06 14:06:21

相關問題