我在ColdFusion Admin的管理控制台中定义了一个数据源。我在set_datasource_util文件中声明了具有相同数据源名称的配置。我有一个使用给定的数据源连接到数据库(Oracle)的网页,它在大多数情况下都能正常工作。但最近我开始看到“变量数据源名称(我的应用程序名称)未定义”等异常。我无法确定根本原因,因为我无法重新创建它,因为它在大多数时间都有效。我可以平均说出1000次点击页面,它会在该例外情况下失败一次。任何人都可以帮助确定可能存在的问题,以便我可以朝那个方向进行调查。
我在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 :(得分: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>
此外,可能是未定义数据源的另一个原因。我假设您有一个拦截器在发生此数据源错误之前捕获它并将它们发送到登录页面或其他东西。