coldfusion - 是否可以使用 onCFCRequest 或类似函数将数据从 cfc 写入调用方请求范围?

标签 coldfusion cfml lucee application.cfc

我想启动一些请求记录,更重要的是,在我的应用程序中进行查询。 Lucee 使这变得非常简单,我可以使用 onRequestEnd 函数中的几行代码记录任何给定页面中的所有查询:

<cfset getQueries   = getPageContext().variablesScope()>
<cfset queryArr     = ArrayNew(2)>
<cfset x            = 0>
<cfloop collection="#getQueries#" item="key">
    <cfif IsQuery(getQueries[key])>
        <cftry>
            <cfset thisQ            = getQueries[key]>
            <cfset thisQT           = thisQ.getExecutionTime() / 1000000>
            <cfset thisSQL          = thisQ.getSQL().getSQLString()>

            <cfset x                = x + 1>
            <cfset queryArr[x][1]   = thisQT>
            <cfset queryArr[x][2]   = thisSQL>
            <cfcatch>
            
            </cfcatch>
        </cftry>
    </cfif>
</cfloop>
这给了我一个包含每个查询的 SQL 的数组(绑定(bind)变量用 ? 表示)和执行时间。我可以将它插入日志数据库并从中获得各种乐趣。
问题是我有很多页面调用 CFC,它们运行查询然后返回数据:
<cfset someVar  = createObject("component","cfc.test").getSomeData(ID=7)>
在我编写日志代码后,我意识到 CFC 中的查询(我的大部分数据处理)没有被记录,因为它们当然是在自己的范围内运行的。我也在寻找一种在 CFC 中记录查询的简单方法。
几分钟前(当谷歌启发我时)我从未听说过 onCFCRequest,我找不到太多关于它使用的信息。我希望它可以像 onRequest 一样工作,我可以这样做:
<cffunction name="onCFCRequest">
    <cfargument type="String" name="cfcName"    required=true/>
    <cfargument type="String" name="methodName" required=true/>
    <cfargument type="struct" name="args"       required=true/>
    
    <cfset caller.getLog    = getLog>

</cffunction>
但是,这不起作用,我尝试过的任何其他变体也不起作用。事实上,这个函数似乎根本不起作用,因为这段代码没有在我的测试表中插入任何东西:
<cffunction name="onCFCRequest">
    <cfargument type="String" name="cfcName"    required=true/>
    <cfargument type="String" name="methodName" required=true/>
    <cfargument type="struct" name="args"       required=true/>
    
    <cfquery>
        insert into testTable       (f1, f2)
                    values          (<cfqueryparam cfsqltype="cf_sql_varchar" value="test1">,
                                     <cfqueryparam cfsqltype="cf_sql_varchar" value="test2">)
    </cfquery>

</cffunction>
使用 onCFCRequest 的正确方法是什么,它可以用于将数据从 cfc 的本地范围写入父/调用方请求范围吗?如果没有,是否可以使用另一个函数(如 onCFCRequestEnd)来执行此操作?我不想为了实现这个目标而对我的应用程序中的每个 cfQuery 或 cfc 文件进行大规模更改。
我知道有一些商业应用程序旨在更好地做到这一点,而我只需几个小时的编码就可以做到。不过,这是针对个人网站,我花钱买不起,自己做的经验很有启发性。

最佳答案

由于您的实际问题是如何记录所有查询执行,无论它们发生在哪里,我认为有两种方法可以做到这一点。
启用日志记录
每当执行查询时,您都可以将 SQL 字符串和参数写入日志。
您可以在 Lucee Admin 中将日志记录设置到您希望的数据库表中。
Lucee Web Admin logging setup
设置完成后,您需要调用 <cflog> 并在 file 中使用指定日志的名称属性。
这种方法的缺点是您必须手动放置 <cflog>每当您执行查询时。这可以通过将所有数据库通信集中在一个也进行日志记录的函数中来缓解。所以当你想查询某些东西时,你会调用那个函数而不是调用 <cfquery>手动。
启用调试
Lucee 的调试功能允许您输出在页面运行中执行的所有查询以及其他有用信息。
您首先需要添加一个调试模板:
重要提示:预定义的模板仅将数据输出到您网站的生成 HTML。尽管您可以创建自己的调试模板。为此,您需要在 lucee-server/context/context/admin/debug/ 中创建自己的模板 CFC。并为其提供一个唯一的名称。还有一个slide show of how to create your own debugging template Lucee 身后的负责人 Gert Franz 更详细地解释了如何做到这一点。
正确完成后,您应该会在模板类型下拉列表中看到您的模板名称。
Lucee Web Admin debugging template
然后,您需要做的就是启用数据库事件的调试:
Lucee Web Admin database activity debugging enabled

关于coldfusion - 是否可以使用 onCFCRequest 或类似函数将数据从 cfc 写入调用方请求范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64840048/

相关文章:

mysql - (MySQL - Coldfusion/Lucee) - 一条 MySQL 语句,多次插入 - 如何获取每个 subsubCategoryID?

java - 使用 Coldfusion(openBD CFML 引擎)java 创建 PDF

java - ColdFusion 程序员想要使用新版本的 Java APNS 但不知道如何编译 Java

mysql - 根据用户注册月份的日期每月选择记录

coldfusion - 使用动态参数数组调用函数

file-upload - 使用 cffile 上传时可以更改文件名吗?

coldfusion - 多CFML引擎测试环境

coldfusion - 我可以在ColdFusion中按索引获取查询吗?

coldfusion - 为什么 CFML 一直尝试分配而不是输出我的变量?

java - 将 MaxMind java 类与 ColdFusion 一起使用