Моя функция Azure периодически не может прочитать строку подключения
У меня есть функция Azure, которая запускается из триггера очереди. В хранилище есть метод для получения строки подключения из коллекции ConnectionStrings.
return System.Configuration.ConfigurationManager.ConnectionStrings["MyDataBase"].ToString();
Это прекрасно работает по большей части, но я периодически вижу, что это возвращает нулевую ошибку исключения.
Есть ли способ, которым я могу сделать это более надежным? Функции Azure иногда не могут получить настройки? Должен ли я сохранить настройки в другом разделе? Я также хочу сказать, что это выполняется тысячи раз в день, но я вижу это всплывающее окно около 100 раз.
Runtime версия: 1.0.12299.0
1 ответ
Вы читаете конфигурацию для каждого вызова функции? Вы должны прочитать его один раз (например, используя Lazy<string>
а также static
) и повторно использовать его для всех вызовов функций.
Возможно, существует проблема параллелизма, когда несколько потоков обращаются к коду. Положить lock
вокруг кода может также помочь. ConfigurationManager.ConnectionStrings
должен быть безопасен, но возможно это не во время выполнения V1.
Подобная проблема была опубликована здесь, но это касалось настроек приложения, а не строк подключения. Я не думаю, что использование CloudConfigurationManager должно быть правильным решением.
Вы также можете попробовать вставить строку подключения в настройки приложения, если вы не используете Entity Framework.
Строки подключения следует использовать только с приложением-функцией, если вы используете платформу сущностей. Для других сценариев используйте Настройки приложения. Нажмите, чтобы узнать больше. (через портал Azure)
Не уверен, относится ли это к среде исполнения V1.
Решением было добавить частную статическую строку для строки подключения. Затем считывайте из конфигурации только в случае сбоя. Затем я добавил повторную попытку с задержкой в полсекунды. Это в основном устранило это.
private static string connectionString = String.Empty;
private string getConnectionString(int retryCount)
{
if (String.IsNullOrEmpty(connectionString))
{
if (System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"] != null)
{
connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"].ToString();
}
else
{
if (retryCount > 2)
{
throw new Exception("Failed to Get Connection String From Application Settings");
}
retryCount++;
getConnectionString(retryCount);
}
}
return connectionString;
}
Не знаю, идеально ли это, но работает. Я перестал видеть это исключение 30 раз в день до нуля.