在继续处理该请求之前,是否可以让CF应用程序检查有效的数据库?
这是因为可能存在数据库服务器可能已关闭或正在升级的情况,因此在发出数据库相关请求时会出现错误。
如果没有与数据库服务器的连接,则可以安全地将用户重定向到安全页面。
或者可以cfcatch工作吗?
如何进行此项检查?
谢谢。
答案 0 :(得分:5)
在Application.cfc文件的onRequestStart方法中或在Application.cfm文件中,您可以运行一个简单的查询来检查数据库是否可用。在cftry / cfcatch中包装查询。如果查询失败,您可以在cfcatch中重定向用户,如果成功,您可以合理地确定您的数据库是“活着的”。
答案 1 :(得分:2)
我在一个项目中使用了这样的检查。代码可能如下所示(不确定它是否适用于低于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进行广泛的错误处理。但是,如果您的数据源可能经常出现问题,那么它可能更有意义。
答案 2 :(得分:2)
为每个请求添加额外的查询以确保数据库已启动是一个明显不好的主意。更好的方法是在应用程序中构建一个“维护模式”切换,在进行计划维护(升级等)时手动启用。
如果您希望在出现错误(如数据库问题)时显示“友好”页面,请使用Application.cfc中的onError()
方法和/或Application中的<cferror .../>
标记。 cfm,作为全局错误处理程序。
答案 3 :(得分:0)
如果你担心数据库可能会消失,我会在你的OnRequestStart处理程序中实现一个“SELECT 1 AS A”查询,该处理程序每N分钟只运行一次。这可以通过使用查询缓存功能来完成。我开始每30分钟执行一次查询。