1

多くの機能を含むコンポーネント「bulletin.cfc」があります。

私のメイン ページには、cfthread タグを使用して 2 つのスレッドが実行されています。

.net から来て、コンポーネントの 2 つのインスタンスを作成し、各スレッドで 1 つ使用すると考えました。このようにして、それらが互いに混乱することはなく、関数にロックを入れることを心配する必要もありません。

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

これは正しいです?

編集:

これまでの回答に感謝しますが、これで発生している問題はまだ理解できません。2 つの個別の 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>  

これは一晩で約 70,000 回実行されますが、毎回約 3 ~ 4 個のエラーが発生します。次のようにエラーが発生するSQLを確認する

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

                        )
4

1 に答える 1

1

インスタンスが参照によって渡されることは正しいので、同時実行の問題が発生する可能性があります。ただし、関数の引数が適切にパラメーター化されていて、インスタンスの一部としてプロパティを変更していない場合 (つまり、これはインターフェイスであり、Bean ではない)、同じインスタンスを安全に再利用できます。各関数呼び出しはそれ自体のスコープであり、内部の変数と返される変数は、関数呼び出しの存続期間中です。

于 2012-08-04T17:26:47.710 に答える