Mysql CFloop处理非常慢
我在自学CF开发,并在学习过程中使用共享的CF托管站点进行测试 我有一个电子表格,包含2500多条数据记录,大约15列。电子表格包含对该应用程序的基础至关重要的数据。它保持脱机状态,并使用cffile定期上载到服务器。上传后,电子表格逐行导入到MySQL表中 问题是它花的时间太长了。例如,它目前正在运行。在过去43分钟内,2500条记录中只有192条被添加到MySQL表中。有没有更有效的方法 如果您查看下面的代码,在cfloop内部,它将运行cfspreadsheet标记,并检索当前行。然后将该行作为CSV数据添加到MySQL表中 关于如何更有效地做到这一点,有什么建议吗Mysql CFloop处理非常慢,mysql,coldfusion-9,cfloop,cfspreadsheet,Mysql,Coldfusion 9,Cfloop,Cfspreadsheet,我在自学CF开发,并在学习过程中使用共享的CF托管站点进行测试 我有一个电子表格,包含2500多条数据记录,大约15列。电子表格包含对该应用程序的基础至关重要的数据。它保持脱机状态,并使用cffile定期上载到服务器。上传后,电子表格逐行导入到MySQL表中 问题是它花的时间太长了。例如,它目前正在运行。在过去43分钟内,2500条记录中只有192条被添加到MySQL表中。有没有更有效的方法 如果您查看下面的代码,在cfloop内部,它将运行cfspreadsheet标记,并检索当前行。然后将该
每次迭代都要读取整个XLS文件,只是为了获取一行。只需在循环之前读取一次文件,然后在其行上循环。Yes'r试图找到一种方法来防止每次循环都打开电子表格,这就解决了它。。。现在快多了
<body bgcolor="#0033FF">
<cfset filenm = "SitesTest.xlsx">
<cfset thisPath = GetDirectoryFromPath(ExpandPath("*.*"))>
<cfset uploaddirectory = "#thisPath#Uploads\">
<cfset uploadfile = "#uploaddirectory##filenm#">
<cfset floc = "#uploadfile#">
<!--- --->
<!--- --->
<!--- --->
<!--- Read Spreadsheet Count number of Rows --->
<cfspreadsheet action="read"
src="#floc#"
headerrow="1"
query="SiteSS"
>
<cfset Records = "#SiteSS.RecordCount#">
<!--- Get Header Row from Row 1 --->
<cfspreadsheet action="read"
format="csv"
name="ColumnHeaderRow"
src="#floc#"
headerrow="1"
rows="1"
columns="1-7,15,16,22,23">
<cfset Headeritems = ListLen(ColumnHeaderRow)>
<cfset csvallVar = "">
<cfset CSVSiteData = "">
<cfspreadsheet
action = "read"
src="#floc#"
query="siteinfo"
rows="1-#Records#"
columns="1-7,15,16,22,23" >
<cfset rowcount = 2>
<cfloop Query="siteinfo" startrow="2" endrow="#Records#" >
<cfset EntryType = "SiteInfo">
<!--- Create Line Item Lists--->
<cfset CSVSiteData = "#siteinfo.col_1#, #siteinfo.col_2#, #siteinfo.col_3#, #siteinfo.col_4#, #siteinfo.col_5#, #siteinfo.col_6#, #siteinfo.col_7#, #siteinfo.col_8#, #siteinfo.col_9#, #siteinfo.col_10#, #siteinfo.col_11#">
<cfset CSVSiteDataCheck = "#siteinfo.col_1#, #siteinfo.col_2#, #siteinfo.col_3#, #siteinfo.col_4#, #siteinfo.col_5#, #siteinfo.col_6#, #siteinfo.col_7#, #siteinfo.col_8#, #siteinfo.col_9#, #siteinfo.col_10#, #siteinfo.col_11#">
<cfset Manager = #siteinfo.col_1#>
<cfset Market = #siteinfo.col_2#>
<cfset FALocationCode = #siteinfo.col_3#>
<cfset USID = #siteinfo.col_4#>
<cfset CommonID = #siteinfo.col_5#>
<cfset EquipmentName = #siteinfo.col_6#>
<cfset EquipmentType = #siteinfo.col_7#>
<cfset PrimaryTech = #siteinfo.col_8#>
<cfset Address = #siteinfo.col_9#>
<cfset LatitudeDecimal = #siteinfo.col_10#>
<cfset LongitudeDecimal = #siteinfo.col_11#>
<!------>
<cfquery name="CheckDup" datasource="TechData">
select CSVSiteData From sitelist2
where CSVSiteData = '#CSVSiteDataCheck#'
</cfquery>
<cfif CheckDup.recordcount lt 1>
<cfquery name="Insertsite" datasource="TechData">
INSERT INTO sitelist2 (
EntryType,
CSVSiteData,
Manager,
Market,
FALocationCode,
USID,
CommonID,
EquipmentName,
EquipmentType,
PrimaryTech,
Address,
LatitudeDecimal,
LongitudeDecimal
)
VALUES (
'#EntryType#',
'#CSVSiteData#',
'#Manager#',
'#Market#',
'#FALocationCode#',
'#USID#',
'#CommonID#',
'#EquipmentName#',
'#EquipmentType#',
'#PrimaryTech#',
'#Address#',
#LatitudeDecimal#,
#LongitudeDecimal#
)
</cfquery>
"Record <cfoutput>#rowcount#</cfoutput> added"<br />
<cfelse>
"Record <cfoutput>#rowcount#</cfoutput> not added"<br />
</cfif>
<cfset rowcount = rowcount + 1>
</cfloop>
</body>
关键的应用程序的基础,然后你可以考虑使用不同的方法,因为上面它易碎。使用加载数据插入工作表将更快,并提供对导入过程的更好控制。另外,请始终将cfqueryparam与查询参数一起使用。除了防止sql注入之外,它还有助于在多次执行同一查询时提高性能?存储分隔数据几乎从来都不是一个好方法。
<body bgcolor="#0033FF">
<cfset filenm = "SitesTest.xlsx">
<cfset thisPath = GetDirectoryFromPath(ExpandPath("*.*"))>
<cfset uploaddirectory = "#thisPath#Uploads\">
<cfset uploadfile = "#uploaddirectory##filenm#">
<cfset floc = "#uploadfile#">
<!--- --->
<!--- --->
<!--- --->
<!--- Read Spreadsheet Count number of Rows --->
<cfspreadsheet action="read"
src="#floc#"
headerrow="1"
query="SiteSS"
>
<cfset Records = "#SiteSS.RecordCount#">
<!--- Get Header Row from Row 1 --->
<cfspreadsheet action="read"
format="csv"
name="ColumnHeaderRow"
src="#floc#"
headerrow="1"
rows="1"
columns="1-7,15,16,22,23">
<cfset Headeritems = ListLen(ColumnHeaderRow)>
<cfset csvallVar = "">
<cfset CSVSiteData = "">
<cfspreadsheet
action = "read"
src="#floc#"
query="siteinfo"
rows="1-#Records#"
columns="1-7,15,16,22,23" >
<cfset rowcount = 2>
<cfloop Query="siteinfo" startrow="2" endrow="#Records#" >
<cfset EntryType = "SiteInfo">
<!--- Create Line Item Lists--->
<cfset CSVSiteData = "#siteinfo.col_1#, #siteinfo.col_2#, #siteinfo.col_3#, #siteinfo.col_4#, #siteinfo.col_5#, #siteinfo.col_6#, #siteinfo.col_7#, #siteinfo.col_8#, #siteinfo.col_9#, #siteinfo.col_10#, #siteinfo.col_11#">
<cfset CSVSiteDataCheck = "#siteinfo.col_1#, #siteinfo.col_2#, #siteinfo.col_3#, #siteinfo.col_4#, #siteinfo.col_5#, #siteinfo.col_6#, #siteinfo.col_7#, #siteinfo.col_8#, #siteinfo.col_9#, #siteinfo.col_10#, #siteinfo.col_11#">
<cfset Manager = #siteinfo.col_1#>
<cfset Market = #siteinfo.col_2#>
<cfset FALocationCode = #siteinfo.col_3#>
<cfset USID = #siteinfo.col_4#>
<cfset CommonID = #siteinfo.col_5#>
<cfset EquipmentName = #siteinfo.col_6#>
<cfset EquipmentType = #siteinfo.col_7#>
<cfset PrimaryTech = #siteinfo.col_8#>
<cfset Address = #siteinfo.col_9#>
<cfset LatitudeDecimal = #siteinfo.col_10#>
<cfset LongitudeDecimal = #siteinfo.col_11#>
<!------>
<cfquery name="CheckDup" datasource="TechData">
select CSVSiteData From sitelist2
where CSVSiteData = '#CSVSiteDataCheck#'
</cfquery>
<cfif CheckDup.recordcount lt 1>
<cfquery name="Insertsite" datasource="TechData">
INSERT INTO sitelist2 (
EntryType,
CSVSiteData,
Manager,
Market,
FALocationCode,
USID,
CommonID,
EquipmentName,
EquipmentType,
PrimaryTech,
Address,
LatitudeDecimal,
LongitudeDecimal
)
VALUES (
'#EntryType#',
'#CSVSiteData#',
'#Manager#',
'#Market#',
'#FALocationCode#',
'#USID#',
'#CommonID#',
'#EquipmentName#',
'#EquipmentType#',
'#PrimaryTech#',
'#Address#',
#LatitudeDecimal#,
#LongitudeDecimal#
)
</cfquery>
"Record <cfoutput>#rowcount#</cfoutput> added"<br />
<cfelse>
"Record <cfoutput>#rowcount#</cfoutput> not added"<br />
</cfif>
<cfset rowcount = rowcount + 1>
</cfloop>
</body>