在继续处理该请求之前让 CF 应用程序检查有效数据库是否可以?
这是因为可能存在数据库服务器可能已关闭或正在升级的情况,因此在发出依赖于 db 的请求时会出现错误。
如果没有连接到 db 服务器,用户可以安全地重定向到安全页面。
或者 cfcatch 可以工作吗?
如何进行此项检查?
谢谢你。
在继续处理该请求之前让 CF 应用程序检查有效数据库是否可以?
这是因为可能存在数据库服务器可能已关闭或正在升级的情况,因此在发出依赖于 db 的请求时会出现错误。
如果没有连接到 db 服务器,用户可以安全地重定向到安全页面。
或者 cfcatch 可以工作吗?
如何进行此项检查?
谢谢你。
在 Application.cfc 文件的 onRequestStart 方法或 Application.cfm 文件中,您可以运行一个简单的查询来检查数据库是否可用。将查询包装在 cftry/cfcatch 中。如果查询失败,您可以在 cfcatch 中重定向用户,如果成功,您可以合理地确定您的数据库是“活动的”。
我在一个项目中使用过这样的检查。代码可能如下所示(不确定它是否适用于低于 8 的 ColdFusion 版本),将此示例视为用 CFScript 编写的 UDF 块:
// service factory object instance
factory = CreateObject("java","coldfusion.server.ServiceFactory");
// the datasource service
dsService = factory.DatasourceService;
// verify the dsn
return dsService.verifyDataSource(arguments.dsn);
哦,我什至在几年前在旧笔记本电脑上写的代码中发现了一个小注释:
// [performance note] this server check takes 1-3ms at local PC (Kubuntu 7.10, CF8 + Apache2, Sempron 3500+, 1GB RAM)
虽然时间看起来很短,但我发现对每个请求执行此检查对我的应用程序并没有真正的用处。无论如何,我习惯于广泛使用 try/catch 来处理错误。但是,如果您的数据源可能经常更改,它可能更有意义。
向每个请求添加额外的查询以确保数据库已启动显然是个坏主意。更好的方法是在您的应用程序中构建一个“维护模式”开关,您可以在进行计划维护(升级等)时手动启用该开关。
如果您希望在发生错误(如数据库问题)时显示“友好”页面,则使用onError()
Application.cfc 中的方法和/或<cferror .../>
Application.cfm 中的标记作为全局错误处理程序。
如果您担心数据库可能会消失,我会在您的 OnRequestStart 处理程序中实现一个“SELECT 1 AS A”查询,该查询仅每 N 分钟运行一次。这可以通过使用查询缓存功能来完成。我将从每 30 分钟执行一次查询开始。