【发布时间】:2016-10-10 20:52:12
【问题描述】:
我知道这个话题似乎被讨论过很多次,但是我尝试了所有提到的方法都没有成功。
我不断收到错误:
请求已超过允许的时间限制标签:CFQUERY
错误发生在第 152 行。
还有
Java堆空间为空
错误发生在-1行。
在同一个 html 页面上。
我相信 Java 堆空间错误会导致超时,反之亦然。
发生超时的程序是
<CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="myQuery" CACHEDWITHIN="#CreateTimeSpan(0,0,5,0)#">
SELECT tableA.productid, tableA.userid, tableA.salesid, tableA.productname, tableA.price, tableA.units, tableA.currency, tableA.terms, tableA.description, tableA.pic, tableA.minorder, tableA.salesid, tableB.id, tableB.company, tableB.city, tableB.state, tableB.country, tableB.contact, tableB.skype
FROM tableA LEFT OUTER JOIN tableB
ON tableA.userid = tableB.userid
WHERE tableA.category = <cfqueryparam value = "#cat#" cfsqltype = "cf_sql_integer" maxLength = "2">
ORDER by tableA.ranks DESC
</CFQUERY>
我不知道如何进一步“优化”?它只检索了大约 28,000 条结果记录,不是 200 万条。我正在使用 MySQL 数据库。
我已将我的 MaxPermSize 从 256MB 增加到 512MB,但问题似乎仍然存在,尤其是当搜索引擎进入网站进行索引时。我在具有 6GB RAM 的服务器上运行 CF9。以下是我在 CF 中的一些设置:
- 最小和最大 JVM 堆大小均设置为 512MB。
- (秒)后的超时请求设置为 60
- JVM 版本 1.7.0_67
- JVM 参数:
-server -Dsun.io.useCanonCaches=false -XX:-UseGCOverheadLimit -XX:MaxPermSize=512m -XX:+UseParallelGC -Xbatch -Dcoldfusion.rootDir={application.home}/../ -Dcoldfusion.libPath= {application.home}/../lib
欢迎提出任何建议。提前致谢。
附加信息:
- 有26类产品
- 每个类别有 20-50K 条记录,并且每天都在增加
- 人们可能会也可能不会在一天中的不同时间访问所有 26 个不同的类别
- 并非所有类别每天都会更新,但有些类别会更新
【问题讨论】:
-
拥有这 28,000 条记录后,您将如何处理它们?
-
要测试错误是否与从数据库查询中获取的行数有关,您可以在 MySQL SQL 语句的末尾,在 ORDER BY 子句之后添加一个 LIMIT 子句...
ORDER BY tableA.ranks DESC LIMIT 1。这并不能“解决”问题,它只会帮助确定错误是否与查询返回的行数有关。 (我在 JVM 设置中没有看到 -Xms 和 -Xmx 参数,您表示它们都设置为 512m。) -
至于“优化” MySQL 查询,我会将实际的 SQL 文本带到另一个客户端,然后运行 EXPLAIN EXTENDED,然后查看执行计划。我还想看看执行 SQL 查询需要多少时间。 (添加 SQL_NO_CACHE 提示以绕过 MySQL 缓存,如果已启用。)也许查询没有有效地使用可用索引和/或合适的索引不可用。 (我们没有看到从数据库返回行后代码在做什么。)
-
@Jack:在我看来你需要弄清楚错误是与返回的行数有关,还是与时间量有关 查询运行,或者如果它是别的东西。与其推测,我会按照我的建议去做。也就是说,将发送到 MySQL 服务器的实际 SQL 文本带到不同的客户端,看看执行需要多长时间。我还会做一些简单的测试,比如添加一个 LIMIT 子句,以测试“仅检索 1 条记录是否会导致 CF 服务器出现问题?”只是我的建议。 (SO 是一个问答网站,不是调试服务。)
-
如果您获得 28,000 条记录并且只使用其中的 20 条,也许您可以考虑返回更少记录的方法。 tableA.ranks 上的过滤器可能是合适的。
标签: java mysql coldfusion jvm