1

ColdFusion Admin の管理コンソールでデータソースを定義しました。set_datasource_util ファイルで同じデータソース名で構成を宣言しました。指定されたデータソースを使用して DB(Oracle) に接続する Web ページがあり、ほとんどの場合正常に動作します。しかし最近、「Variable datasource-name(my app name) is undefined」のような例外が見られるようになりました。ほとんどの場合は機能するため、根本的な原因を再現できないため、根本的な原因を特定できません。ページの平均 1000 ヒットで、その例外を除いて 1 回失敗すると言えます。その方向で調査できるように、考えられる問題を特定するのを手伝ってくれる人はいますか。

CFAdmin で WOCD080P_ABC を構成しました。

以下は、Application.cfm のコードです。

<cfif client.securityLevel NEQ ''>
    <cfinvoke component="#siteroot#.CFC.Set_Data_Source_Util" method="fnSetABCDataSource" returnvariable="ABCDataSourceDefinition">
        <cfinvokeargument name="Environment" value="#variables.thisServerType#" />
    </cfinvoke>
    <cfif ABCDataSourceDefinition.DataSource NEQ 'Error'>
        <cfset DATASOURCE_ABC = ABCDataSourceDefinition.DataSource />
        <cfset DBUSER_ABC = ABCDataSourceDefinition.DBUser />
        <cfset DBPASSWORD_ABC = ABCDataSourceDefinition.DBPassword />
    </cfif>
</cfif>

以下は Set_datasource_UTil のコードです。

<cffunction name="fnSetABCDataSource" access="public" returntype="struct">
    <cfargument name="Environment" type="string" required="yes">

    <cfset ReturnParameters = StructNew() />

    <cfif Environment IS 'prod'>
        <cfset ReturnParameters.DataSource = 'WOCD080P_ABC' />
        <cfset ReturnParameters.DBUser = ''/>
        <cfset ReturnParameters.DBPassword = '' />
    <cfelse>
        <cfset ReturnParameters.DataSource = 'WOCD080T_ABC'/>
        <cfset ReturnParameters.DBUser = ''/>
        <cfset ReturnParameters.DBPassword = '' />
    </cfif>

    <cfreturn ReturnParameters>
</cffunction>   

以下は、HTMLファイルから実行しているコードです。

<cfinvoke component="#siteroot#.cfc.ABC_UTIL" method="GetRegion" returnVariable = "USregion" >
    <cfinvokeargument name="dbSource" value=#DATASOURCE_ABC# />
    <cfinvokeargument name="dbUser" value=#DBUSER_ABC# />
    <cfinvokeargument name="dbPass" value=#DBPASSWORD_ABC# />
</cfinvoke>

HTML ファイルのコードはほとんどの場合機能しますが、変数 DATASOURCE_ABC が定義されていないというエラーで壊れることがあります。どんな助けでも感謝します。

4

1 に答える 1

0

CFC 関数内のローカル変数に var キーワードを使用していることを確認してください。

<cfset var ReturnParameters = StructNew() />

var の代わりに CF9+ ローカル スコープを使用できます。

<cfset local.ReturnParameters = StructNew() />

保護を強化するには、application.cfm 内の次のステートメントを改善してください。

<cfif isDefined("ABCDataSourceDefinition.DataSource") 
    AND ABCDataSourceDefinition.DataSource NEQ 'Error'>
    <cfset DATASOURCE_ABC = ABCDataSourceDefinition.DataSource />
    <cfset DBUSER_ABC = ABCDataSourceDefinition.DBUser />
    <cfset DBPASSWORD_ABC = ABCDataSourceDefinition.DBPassword />
</cfif>

また、データソースが定義されていない理由の別の原因である可能性もあります。このデータソースエラーが発生する前にそれをキャッチし、ログインページなどに送信するインターセプターがあると思います。

于 2013-03-14T16:56:54.083 に答える