Прежде чем продолжить, проверьте имя источника данных в реальном времени.

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

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

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

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

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

Спасибо.


person n_kips    schedule 15.01.2011    source источник


Ответы (4)


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

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

person Sergey Galashyn    schedule 15.01.2011
comment
Это отличное решение, однако вы должны знать, что использование фабрики сервисов технически недокументировано и может быть удалено в более поздних версиях ColdFusion. Аналогичным, но задокументированным подходом будет использование AdminAPI. По сути, вы сделаете то же самое (проверите источник данных), но поддерживаемым способом. - person Sean Coyne; 15.01.2011

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

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

person Adam Tuttle    schedule 15.01.2011

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

person Aaron Greenlee    schedule 16.01.2011