Coldfusion Ping或检查外部DSN是否在线

时间:2013-08-15 10:23:48

标签: coldfusion dsn

如果以前曾经问过这个问题,我会道歉但我找不到任何可以回答我问题的内容。

我们有一个从我们的网站运行的Coldfusion脚本,并在办公室中查询外部dsn。

问题是服务器位于英国乡村,有时服务器不可用(感谢我们不可靠的英国ISP !!)

coldfusion中是否有可以查询或ping外部dsn的命令,因此我可以将整个脚本包装在cfif语句中,如果连接失败则会收到电子邮件?

3 个答案:

答案 0 :(得分:3)

这是对duncan答案的评论的扩展,但不能将代码块放在评论中,所以......

<cfset TargetHost = "0.0.0.0" />
<cfset PingAttempts = 4 />

<cfif find('Windows',Server.Os.Name)>
    <cfset Args = "-n #PingAttempts# #TargetHost#" />
<cfelse>
    <cfset Args = "-c #PingAttempts# #TargetHost#" />
</cfif>

<cfexecute name="ping" arguments=#Args# variable="PingResult" timeout=10 />

<cfif PingResult CONTAINS "100% packet loss"
    OR PingResult CONTAINS "100% loss"
    >
    [send alert]
</cfif>

<cfdump var=#PingResult# />

(一般情况下,我仍然会通过实际查询进行检查 - ping只会确认机器在线,而不是数据库正在响应。)

答案 1 :(得分:2)

JFGI:

<cfexecute name="C:\winnt\system32\ping.exe" arguments="#request.myIP#"  variable="myPing" timeout="8"></cfexecute> 

或者在Linux / Unix上:

<cfexecute name="ping" arguments="#request.myIP# -c 3" timeout="10" variable="myPing" />

<cfif myPing contains "Request timed out">
  <cfmail ...>
<cfelse>
  [do something else]
</cfif>

http://www.bennadel.com/blog/751-Learning-ColdFusion-8-Ping-User-Defined-Function-Inspired-By-Ray-Camden-.htm

答案 2 :(得分:2)

要确定数据源是否有效,请尝试使用它:

<cftry>
    <cfquery datasource="external" timeout=10 >
        SELECT 1
    </cfquery>
    <cfcatch>
        <cfif [timeout error]>
            <cfmail ...>No response in 10 seconds</cfmail>
        <cfelse>
            [do something else]
        </cfif>
    </cfcatch>
</cftry>


由于这似乎不起作用,另一种选择可能是:

<cfthread action="run" name="QueryThread">
    <cfquery datasource="external">SELECT 1</cfquery>
</cfthread>
<cfthread action="run" name="CheckThread">
    <cfthread action="sleep" duration="10000" />
    <cfif cfthread.QueryThread.Status NEQ 'COMPLETED'>
        [handle error]
        <cfthread action="terminate" name="QueryThread" />
    </cfif>
</cfthread>

相同的概念,但使用多个线程应该意味着即使查询太深而CF无法中断,您仍然可以在十秒钟后触发电子邮件发送。