2013-03-13 86 views
1

我在ColdFusion Admin的管理控制台中定义了一个数据源。我已经在set_datasource_util文件中声明了具有相同数据源名称的配置。我有一个使用给定的数据源连接到数据库(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某个时候爆发。 任何帮助表示赞赏。

+0

上一次我遇到这个错误是因为服务器由于流氓进程随机吃掉所有可用资源而进入OOM。我会检查你的服务器日志和你可能使用的任何监控软件。 – Busches 2013-03-13 12:53:06

+0

您是否将数据源设置为Application.cfc的属性,如'this.datasource ='datasource_name''中所示?如果是这样,请发布Application.cfc中的相关代码以及您声明配置的set_datasource_util文件中的代码片段。 – imthepitts 2013-03-13 16:30:09

+0

我已修改问题并添加了代码片段。请检查和建议。感谢您的回复 – 2013-03-14 09:42:10

回答

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> 

而且,可能是另一个来源为什么没有定义数据源。我假设你有一个拦截器捕获这个数据源发生错误之前,并将它们发送到登录页面或其他东西。