我目前正试图开发一个API和我在哪里刚才阶段是填充表一个完整的数据集(ID,姓氏,名字,出生日期等)。
我写这个问题的方法是使用从1 CFLOOP至50万(因为我不知道是什么范围ID的范围从和),并且每个CFLOOP中我调用一个函数,使一个CFHTTP请求到服务器并检索内容。
然后我反序列化JSON返回,调用一个函数来查询我的表,看看当前项目ID已经存在,如果没有,调用一个函数来插入记录。
然而,CFLOOP似乎停止围绕300关口的要求,所以我在想,如果有一个更好的办法做到我在做什么? 也许通过CFTHREAD标签,我从来没有使用过任何经验。
用于该代码段如下所示:
<cfset Variables.url = "someurl.html" />
<cfloop from=100000 to=500000 index="itemNo">
<cfset Variables.itemID = itemNo />
<cfset getItemData = Application.cfcs.Person.getPersonData(Variables.url,Variables.itemID) />
<cfif StructKeyExists(Variables,"getPersonData.FileContent")>
<cfset Variables.getPersonData = DeserializeJSON(getPersonData.FileContent)>
<cfscript>
// CHECK IF PERSON ALREADY IN DATABASE
Variables.getPerson = Application.cfcs.Person.getPersonRecord(Variables.itemID);
// INSERT ITEM IN TO TABLE
Variables.DOB = CreateDate(Year(Variables.getPersonData.Item.DateOfBirth.Year),Month(Variables.getPersonData.Item.DateOfBirth.Month),Day(Variables.getPersonData.Item.DateOfBirth.Day));
Variables.insPerson = Application.cfcs.Person.insPerson(Variables.getPersonData.personID,Variables.getPersonData.Item.FirstName,Variables.getPersonData.Item.LastName,Variables.getPersonData.Item.CommonName,Variables.DOB);
</cfscript>
</cfif>
</cfloop>
对的,这是可能的。 您需要拆分电话。 创建一个简单的HTLM页面,这使得在JavaScript中一个XMLHttpRequest。 我没有测试过下面的例子,但它应该工作。
<script>
var itemNo= 1;
function download()
{
var xhr = new XMLHttpRequest();
xhr.open("GET", "getdata.cfm?itemNo="+itemNo, true);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200)
{
itemNo++;
if(itemNo<=500000) download();
}
else
{
itemNo++;
// Error handling
}
}
};
xhr.onerror = function (e) {
itemNo++;
// Error handling
};
xhr.send(null);
}
</script>
在被请求的页面进行调用,使CFHTTP请求的对象。
<!--- getdata.cfm --->
<cfset Variables.url = "someurl.html" />
<cfset Variables.itemID = itemNo />
<cfset getItemData = Application.cfcs.Person.getPersonData(Variables.url,Variables.itemID) />
<cfif StructKeyExists(Variables,"getPersonData.FileContent")>
<cfset Variables.getPersonData = DeserializeJSON(getPersonData.FileContent)>
<cfscript>
// CHECK IF PERSON ALREADY IN DATABASE
Variables.getPerson = Application.cfcs.Person.getPersonRecord(Variables.itemID);
// INSERT ITEM IN TO TABLE
Variables.DOB = CreateDate(Year(Variables.getPersonData.Item.DateOfBirth.Year),Month(Variables.getPersonData.Item.DateOfBirth.Month),Day(Variables.getPersonData.Item.DateOfBirth.Day));
Variables.insPerson = Application.cfcs.Person.insPerson(Variables.getPersonData.personID,Variables.getPersonData.Item.FirstName,Variables.getPersonData.Item.LastName,Variables.getPersonData.Item.CommonName,Variables.DOB);
</cfscript>
</cfif>
在请求的页面,你可以使用cfhtread同时拨打多个HTTP请求。 你可以看看这里的更多有关使用cfthread与CFHTTP一起http://www.bennadel.com/blog/749-Learning-ColdFusion-8-CFThread-Part-II-Parallel-Threads.htm