我们正在从ColdFusion 9升级到ColdFusion 2016,我们注意到整体性能下降.我们进行了几次模拟以提供更多洞察力.下面是一个脚本,它提供了性能下降的一个很好的示例.该脚本构建一个查询,然后从查询中创建一个结构.
<!--- Machine info --->
<cfset runtime = createObject("java", "java.lang.System")>
<cfset props = runtime.getProperties()>
<cfset env = runtime.getenv()>
<Cfoutput>
coldfusion: #SERVER.ColdFusion.ProductVersion# #SERVER.ColdFusion.ProductLevel#<br>
java.version: #props["java.version"]#<br>
java.vm.name: #props["java.vm.name"]#<br>
os.name: #props["os.name"]#<br>
PROCESSOR_IDENTIFIER: #env["PROCESSOR_IDENTIFIER"]#<br>
PROCESSOR_ARCHITECTURE: #env["PROCESSOR_ARCHITECTURE"]#<br>
NUMBER_OF_PROCESSORS: #env["NUMBER_OF_PROCESSORS"]#<br><Br>
</Cfoutput>
<!--- Create a query --->
<cfset myQuery = QueryNew("Name, Time, Advanced", "VarChar, Time, Bit")>
<cfset testQuery = QueryNew("ColumnA,ColumnB,ColumnC,ColumnD,ColumnE,ColumnF,ColumnG,ColumnH,ColumnI,ColumnJ,ColumnK,ColumnL,ColumnM,ColumnN","VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar")>
<!--- Populate the query --->
<Cfloop from=1 to=300 index="x">
<cfset QueryAddRow(testQuery, 1)>
<cfloop index="intLetter" from="#Asc('A')#" to="#Asc('N')#" step="1">
<cfset temp = QuerySetCell(testQuery, "Column#chr(intLetter)#", "Row #x# column …
Run Code Online (Sandbox Code Playgroud) 这不会在ColdFusion 11中崩溃,但会在ColdFusion 2016中崩溃
SELECT *
FROM dbo.Roles WITH (NOLOCK)
WHERE Code IS NOT NULL
AND Active = 1
AND RoleID IN (SELECT RoleID FROM dbo.Emp WITH (NOLOCK)) -- It's ok to look at termed employees
Run Code Online (Sandbox Code Playgroud)
这两种方法都可以
SELECT *
FROM dbo.Roles WITH (NOLOCK)
WHERE Code IS NOT NULL
AND Active = 1
AND RoleID IN (SELECT RoleID FROM dbo.Emp WITH (NOLOCK))
Run Code Online (Sandbox Code Playgroud)
是否有恢复原始行为的设置?
UPDATE
我以为我有一个最小的问题例子,但我没有.这是完整的查询
SELECT '<ul>' + STUFF (
(
SELECT MIN(Role) AS "li/code", Code AS "li/span/b", 'Unsorted' AS "li/span/var"
FROM …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将大量数据转换为兆字节.我不想要小数
numeric function formatMB(required numeric num) output="false" {
return arguments.num \ 1024 \ 1024;
}
Run Code Online (Sandbox Code Playgroud)
然后它抛出一个错误
我该如何解决这个问题?
我刚刚安装了ColdFusion 2016(从CF10升级),我注意到每当我尝试访问我的webroot中名为'api'的文件夹时,我都会收到内部500错误.
例如:www.mysite.com/api/
我假设这与新的ColdFusion API REST服务有关,所以我创建了另一个名为'rest'的目录,执行了相同的测试(www.mysite.com/rest/),并收到了另外500个错误.
奇怪的是,我没有使用ColdFusion REST服务,我没有在ColdFusion Administrator中启用它.
我的问题:
您是否允许在您的Web根目录中拥有名为"api"或"rest"的文件夹名称?或者这些是现在保留的文件夹名称?是否有解决方法来禁用特定站点的此功能,以便我可以使用这些文件夹名称?
我最初发布这个作为早期关于ColdFusion 2016上的空CGI.REDIRECT_URL的问题的答案.在考虑之后,我认为它更好,因为技术上没有回答OP的问题.相反,我决定把它变成一个单独的问题,尽管它更像是一个评论而不是一个问题.虽然这在技术上可能无法满足最小,完整和可验证的例子的全部要求,而且人们可能会给我带来帮助,但我认为它还是值得的,希望能够更容易找到未来可能遇到此问题的CFers .因此,关于CGI结构/范围的这种特殊行为,防止它们撞到墙上.
话虽如此,CGI结构/范围与其他结构/范围有一些未记录的不一致行为.请注意,我个人对这一发现不予理睬,因为我在阅读Ben Nadel的博客文章时发生过这段时间.所以我在这里发布的所有信息都已在那里详细说明,但我想在这里写一篇很好的总结.
未记录的行为1 - 与其他结构不同,如果CGI结构键不存在,则在引用它时不会引发错误.
在OP的原始问题中,他想知道为什么cgi.REDIRECT_URL
存在但是空洞.正如他最终发现的那样,它从未真正存在过.作为一个单独的示例,您可以执行此行代码而不会抛出错误.不是你期望的,是吧?
<cfoutout>#cgi.THIS_IS_A_FAKE_KEY#</cfoutout>
Run Code Online (Sandbox Code Playgroud)
那么什么是CFer呢?测试密钥存在.
<cfif structKeyExists( CGI, 'THIS_IS_A_FAKE_KEY' )>
THIS_IS_A_FAKE_KEY exists
<cfelse>
THIS_IS_A_FAKE_KEY doesn't exist
</cfif>
Run Code Online (Sandbox Code Playgroud)
未记录的行为2 - 与其他结构不同,如果转储CGI结构,它将不会显示所有键/值对,它只显示一组已定义的键.
在OP的情况下,他有一个自定义的Apache CGI变量cgi.REDIRECT_URL
,在升级到CF2016之前在他的代码中使用,并且能够直接引用它.但是,我假设他是否抛弃了cgi
结构,它不会出现在转储中.在Ben Nadel的案例中,他还有一个自定义cgi
变量,称为cgi.document_root
从负载均衡器传递并且能够直接引用它,但是在转储cgi
内容时他也无法看到密钥.
那么什么是CFer呢?理解这一点并将其存储在您的脑海中,这样当您转储cgi
内容并且键/值对不存在时,您将不会被咬.除此之外,其他并不多.
coldfusion coldfusion-9 coldfusion-10 coldfusion-11 coldfusion-2016
我正在调用API并需要向其发送带有凭据的JSON字符串.我们目前正在从CF9过渡到CF2016.在DEVL中我有两个版本.在测试和产品中我目前只有CF9.最初我编写代码并在CF2016上测试过,它工作正常.当我把它推到测试时,它没有用.我在DEVL中重试CF9,它也有错误.代码是:
<cfset logininfo = {"username": "eistech", "password": "#sat_pw#"}>
<cfset fromdate=dateformat(DateAdd('d', -1, dat), "yyyy-MM-dd") & 'T00:00:00-0500'>
<!--- Get token info--->
<cfhttp url="https://scoresdownload.collegeboard.org/pascoredwnld/files/list?fromDate=#fromdate#" method="post" result="finfo">
<cfhttpparam name="Content-Type" type="HEADER" value="application/json">
<cfhttpparam name="Accept" type="HEADER" value="application/json">
<cfhttpparam type="body" value="#serializeJSON(logininfo)#">
</cfhttp>
Run Code Online (Sandbox Code Playgroud)
在CF9中运行时,我得到:
在第5行第20行找到无效的CFML构造.ColdFusion正在查看以下文本:
{ (Line 20 is <cfset logininfo = {"username": "eistech", "password": "#sat_pw#"}>
我尝试用单引号括起来,但在两个实例中都失败了.如何在CF2016和CF9中使用它?
我正在通过ColdFusion创建一个简单的CRUD应用程序.我要去ColdFusion管理员面板http://localhost:8600/CFIDE/administrator/index.cfm
,并添加一个"新数据源".但是我收到以下错误:
Connection verification failed for data source: dsnMyVariable
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
The root cause was that: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
Run Code Online (Sandbox Code Playgroud)
我有查询应该在会话结束时运行.如果有记录与用户帐户绑定,那么我想删除该记录.我使用会话范围来存储用户ID.用户手动注销或会话超时后,应运行此查询.这是一个例子:
public void function onSessionEnd(required struct sessionScope, struct applicationScope={}) {
local.qryTest = new Query();
local.qryTest.setDatasource("#arguments.Application.dsnWriteDelete#");
local.qryTest.setSQL("DELETE Locked WHERE RecID = :RecID");
local.qryTest.addParam(name="RecID",value="#SESSION.userID#",cfsqltype="cf_sql_integer");
qryTest.execute();
return;
}
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中使用J2EE会话.以下是用户手动注销时结束会话的方法:
<cffunction name="LogOut" access="remote" output="yes" returnformat="JSON">
<cfset local.fnResults = structNew()>
<cfif structKeyExists(SESSION.AccountInfo, "AccountID")>
<cftry>
<cfset local.temp = getPageContext().getSession().invalidate()>
<cfset local.fnResults = {status : "200"}>
<cfcatch type="any">
<cfset local.fnResults = {status : "400", message : "Error! Please contact your administrator."}>
</cfcatch>
</cftry>
<cfelse>
<cfset local.fnResults = {status : "400", message : "Error! Please contact your administrator."}> …
Run Code Online (Sandbox Code Playgroud) 我目前正在使用<cfinvoke>
标签来调用CFC并传递它们的参数.这非常方便,因为我可以使用标签仅传入我想要的参数:
<cfinvoke component="pathtofolder.imagehandler" method="SomeMethod" argumentcollection="#VARIABLES#" returnvariable="ImageHandlerResult">
<cfif structkeyexists(ARGUMENTS, 'Argument1')>
<cfinvokeargument name="Parameter1" value="#ARGUMENTS.Argument1#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument2')>
<cfinvokeargument name="Parameter2" value="#ARGUMENTS.Argument2#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument3')>
<cfinvokeargument name="Parameter3" value="#ARGUMENTS.Argument3#" />
</cfif>
</cfinvoke>
<cfreturn ImageHandlerResult /> <!--- how do you get this using createObject/new method? --->
Run Code Online (Sandbox Code Playgroud)
如果我使用new()
或createObject()
方法创建CFC的实例,然后在这个新创建的实例中调用方法,我无法有条件地传递参数.我在运行时遇到错误.
<cfset ImageHandler = new pathtofolder.imagehandler()/>
<cfset ImageHandler.SomeMethod(
<cfif StructKeyExists(ARGUMENTS, 'Argument1')>
Parameter1 = ARGUMENTS.Argument1
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument2')>
Parameter2 = ARGUMENTS.Argument2
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument3')>
Parameter3 = ARGUMENTS.Argument3
</cfif>
)/> …
Run Code Online (Sandbox Code Playgroud) 我有一个接受一堆字段的 REST Web 服务。这些字段将进行处理并最终成为电子邮件的一部分。
当我建立电子邮件时,调用的字段message.image
稍后将变为rc.image
,它将通过以下方式添加到 HTML 电子邮件中
...
var body &= "<p><img src='#EncodeForHTMLAttribute(rc.image)#' alt='#EncodeForHTMLAttribute(rc.image_name)#'></p>";
...
Run Code Online (Sandbox Code Playgroud)
我担心这可能仍然是漏洞
coldfusion ×10
coldfusion-2016 ×10
cfml ×2
coldfusion-9 ×2
base64 ×1
cfc ×1
cfmail ×1
cfquery ×1
iis ×1
json ×1
mysql ×1
session ×1
t-sql ×1