Проверьте действующее имя источника данных, прежде чем продолжить - PullRequest
5 голосов
/ 15 января 2011

Было бы нормально, если бы приложение CF проверяло действительную базу данных, прежде чем приступить к обработке этого запроса?

Это связано с тем, что могут быть случаи, когда сервер базы данных отключается или обновляется, поэтому возникает ошибка при выполнении зависимого от дБ запроса.

Если нет соединения с сервером БД, пользователь может быть безопасно перенаправлен на безопасную страницу.

Или cfcatch может работать?

Как сделать эту проверку?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 15 января 2011

в вашем методе onRequestStart вашего файла Application.cfc или в файле Application.cfm вы можете выполнить простой запрос, чтобы проверить, доступна ли база данных.Оберните запрос в cftry / cfcatch.Если запрос не выполнен, вы можете перенаправить пользователя в cfcatch, если он успешно выполнен, вы можете быть достаточно уверены, что ваша база данных «жива».

2 голосов
/ 16 января 2011

Добавление дополнительного запроса к каждому запросу, чтобы убедиться, что база данных работает, является явно плохой идеей.Лучшим подходом было бы встроить в приложение переключатель «режима обслуживания», который вы бы включили вручную, когда выполняете плановое обслуживание (обновления и т. Д.).

Если вы хотите иметь «дружественную» страницуотображается, когда возникает ошибка (например, проблемы с базой данных), затем используйте метод onError() в Application.cfc и / или тег <cferror .../> в Application.cfm в качестве глобальногообработчик ошибок.

2 голосов
/ 15 января 2011

Я использовал такую ​​проверку в одном проекте. Код может выглядеть следующим образом (не уверен, что он будет работать в версиях ColdFusion ниже 8), рассмотрим этот пример как кусок UDF, написанный на CFScript:

// 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 для обработки ошибок. Но если ваши источники данных могут часто менять, это может иметь больше смысла.

0 голосов
/ 16 января 2011

Если вы беспокоитесь, что БД может исчезнуть, я бы реализовал запрос «SELECT 1 AS A» в вашем обработчике OnRequestStart, который выполняется только каждые N минут. Это может быть достигнуто с помощью функции кэширования запросов. Я бы начал с выполнения запроса каждые 30 минут.

...