1

我在 ColdFusion Admin 的管理控制台中定义了一个数据源。我已经在 set_datasource_util 文件中声明了具有相同数据源名称的配置。我有一个使用给定数据源连接到 DB(Oracle) 的网页,它在大多数情况下都能正常工作。但是最近我开始看到诸如“变量数据源名称(我的应用程序名称)未定义”之类的异常。我无法确定根本原因,因为我无法重新创建它,因为它大部分时间都在工作。我可以说平均 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() />

CF9+ 局部作用域可以用来代替 var:

<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 回答