【问题标题】:ColdFusion Server CFC Caching IssueColdFusion 服务器 CFC 缓存问题
【发布时间】:2011-01-15 22:01:16
【问题描述】:

我在笔记本电脑上使用自己的 ColdFusion 8 服务器和在 Windows Vista 上运行的 IIS 开发 ColdFusion 应用程序。我有一个相当烦人的问题。

问题是每当我对我的 CFC 进行任何更改时,似乎除非我重新启动我的 ColdFusion 应用程序服务器,否则对我的 CFC 的更改将在我这样做之前不会生效。很多时候,我不得不重新启动我的整台机器,因为 Windows 无法重新启动 ColdFusion Application Server 服务。有没有更好的方法来重置 ColdFusion 服务器的 cfc 缓存?

这开始占用大量时间,只是在我进行更改后不得不每隔一段时间重新启动一次。任何见解将不胜感激!

谢谢!

【问题讨论】:

  • 它们在您的应用范围内吗?您是否还检查了“服务器设置”>“缓存”下的“保存类文件”?
  • 您是否将它们保存到任何持久范围?会话/服务器/等?
  • 检查 Admin > Data & Services > Web Services 并查看 cfcs 是否将自己注册为 Web 服务,如果是,请从该屏幕删除它们,看看是否有帮助。
  • 它们都没有注册为网络服务。但是,我将一些 CFC 保存到应用程序和会话范围。我能做些什么来解决这个问题?
  • @Gavin 您是在研究普通 CFC 还是 Web 服务 CFC?

标签: caching coldfusion cfc


【解决方案1】:

我保证您将这些对象创建为某种持久范围内的对象,例如:应用程序、会话范围。我通常在开发过程中避免这个问题的做法是创建一个 url 参数并在 application.cfm/cfc 文件(或您创建对象的任何位置)中检查该参数,如果检测到该 url 参数,则重新创建对象。

例子:

<cfif NOT structKeyExists(application,"myObj") OR structKeyExists(url,"reinit")>
    <cfset application.myObj = createObject("component","path.to.cfc") />
</cfif>

当然,您需要对遇到问题的每个对象都执行此操作。

【讨论】:

  • 这让我头疼了很久。我没有意识到将某些东西放入应用程序范围实际上可以节省代码。我认为它只会保存对象的元数据。谢谢!
【解决方案2】:

我不确定这是否也在其他版本的 CF 中,但在 CF9 中,您可以执行 ApplicationStop(),它会重置 CFApplication 并重新加载它。

【讨论】:

  • 这正是我所需要的!但我正在运行 CF8。该版本不支持它:(
【解决方案3】:

在 CFAdmin 中取消选中“组件缓存” --> 缓存

还要检查 CFAdmin --> Mappings 并确保 CFC 文件夹指向正确的文件夹(如果有)。有时人们会克隆他们的源代码,而不是将映射更改为新文件夹。

【讨论】:

    【解决方案4】:

    在您的 Coldfusion Administrator 中,您是否启用(选中)了以下任一功能?

    缓存 > 可信缓存

    缓存 > 保存类文件

    【讨论】:

      【解决方案5】:

      只问显而易见的: 你是从 onApplicationStart 调用这些函数吗?

      【讨论】:

      • 不,在ApplicationStart上没有调用函数。
      【解决方案6】:

      也许可以试试 CF Admin > Caching 下的“Clear template cache”按钮。

      我以前也遇到过这种情况。 CF注册更改的文件通常需要多次单击按钮。

      也可以尝试取消选中缓存下的所有内容。注意:仅对开发机器执行此操作!!!

      【讨论】:

      • 感谢您的回复。我试过但没有用。无论如何,这通常只适用于我的 .cfm 文件。我尝试启用然后禁用缓存选项,不高兴:(。在我的公司决定升级到 CF9 或更高版本之前,它几乎听起来必须不断重启 CF 应用程序服务器。
      【解决方案7】:

      如果你必须在 dev 中有缓存,你可以做我做的:

      首先在 onRequest() 方法的顶部检查 URL 标志,该方法将调用 onApplicationStart() 方法:

      <cfif IsDefined("URL.dev")>
          <cflock timeout="5" scope="Session" type="Exclusive">
              <cfif URL.dev EQ true>
                  <cfset SESSION.debug = true />
              <cfelse>
                  <cfset StructDelete(SESSION, "debug") />
              </cfif> 
          </cflock>
      </cfif>
      
      <cflock timeout="5" scope="Session" type="Readonly">
          <cfif IsDefined("URL.appreset") or IsDefined("SESSION.dev")>
                  <cfset StructClear(SESSION) />
                  <cfset onApplicationStart() />
              </cfif>
      </cflock>   
      

      这将解决您的大部分问题。但是,如果您正在加载的类中出现问题,那么它就不足以检查该标志。我为此使用的解决方案:

      将以下内容添加到 onError() 方法的底部:

      <cfif IsDefined("APPLICATION")>
            <cfset StructClear(APPLICATION) />
      </cfif>
      

      最后,您要检查 APPLICATION 对象是否存在,以及您声明为 APPLICATION 范围一部分的每个类是否存在,或者您要调用 onApplicationStart()。为此,请在 onRequestStart() 顶部的第一个代码块下方添加以下内容:

      <cfif not IsDefined("APPLICATION")
          OR not StructKeyExists(APPLICATION, "[ClassName1]")
          OR not StructKeyExists(APPLICATION, "[ClassName2]")
          ...>
          <cfset onApplicationStart() />
      </cfif>
      

      【讨论】:

        【解决方案8】:

        我遇到了完全相同的问题,如果在启动服务管理器后无法反映更改,有时我不得不重新启动机器。

        我所做的是,在(管理员,缓存): 1.我取消选中所有缓存选项 2.我将文本框的值设置为“0” 3.我在开发的时候保持(Administrator,Caching)页面打开,这样当我上传一个改动没有反映的时候,我就直接点击“Clear Template Cache Now”。

        这就是我在 CF8、内置 Web 服务器、XP 上的工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-17
          • 2012-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多