Coldfusion 变量数据源未定义

Coldfusion 变量数据源未定义,coldfusion,oracle11g,coldfusion-9,Coldfusion,Oracle11g,Coldfusion 9,我在ColdFusion admin的管理控制台中定义了一个数据源。我在set_datasource_util文件中声明了具有相同数据源名称的配置。我有一个网页,它使用给定的数据源连接到DBOracle,并且在大多数情况下运行良好。但最近我开始看到一些异常,比如变量数据源名称我的应用程序名称未定义。我无法确定根本原因,因为我无法重新创建它,因为它大部分时间都在工作。我可以说,在1000次页面点击中,除了这个例外,它平均失败1次。有没有人能帮助我确定可能的问题,以便我可以朝这个方向进行调查 我已经

我在ColdFusion admin的管理控制台中定义了一个数据源。我在set_datasource_util文件中声明了具有相同数据源名称的配置。我有一个网页,它使用给定的数据源连接到DBOracle,并且在大多数情况下运行良好。但最近我开始看到一些异常,比如变量数据源名称我的应用程序名称未定义。我无法确定根本原因,因为我无法重新创建它,因为它大部分时间都在工作。我可以说,在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未定义而中断。
非常感谢您的帮助。

请确保您在CFC函数中为局部变量使用了var关键字:

<cfset var ReturnParameters = StructNew() />
CF9+局部范围可用于替代var:

<cfset local.ReturnParameters = StructNew() />
为获得额外保护,请在应用程序中改进此声明。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>

此外,数据源可能是未定义数据源的另一个原因。我假设您有一个拦截器,它在数据源错误发生之前捕获该错误并将其发送到登录页面或其他地方

上一次我遇到这个错误是因为一个恶意进程随机吃掉了所有可用资源,导致服务器OOM。我会检查您的服务器日志和您可能正在使用的任何监控软件。您是否将datasource设置为Application.cfc的属性,如此。datasource='datasource_name'?如果是这样,请发布Application.cfc中的相关代码和声明配置的set_datasource_util文件中的代码片段。我已经修改了问题并添加了代码片段。请检查并提出建议。感谢您的代码回复,看起来您只是在设置数据源。是否有时会将其设置为“Error”,因此未设置DATASOURCE_ABC变量?