我的Azure函数间歇性无法读取连接字符串

时间:2019-03-02 14:02:20

标签: azure azure-functions azure-functions-runtime

我有一个运行于队列触发器之外的azure函数。存储库具有从ConnectionStrings集合中获取连接字符串的方法。

return System.Configuration.ConfigurationManager.ConnectionStrings["MyDataBase"].ToString();

这在大多数情况下效果很好,但我断断续续地看到这会返回空异常错误。
有什么办法可以使它更强大吗? 天蓝色功能有时无法获取设置吗? 我应该将设置存储在其他部分吗? 我还想说这一天要运行数千次,但我看到的弹出窗口大约是100次。 运行时版本:1.0.12299.0

2 个答案:

答案 0 :(得分:1)

您是否正在阅读每个函数调用的配置?您应该考虑读取一次(例如,使用Lazy<string>static),并将其重新用于所有函数调用。

当多个线程访问代码时,可能存在并发问题。在代码周围放置lock也会有所帮助。 ConfigurationManager.ConnectionStrings应该是安全的,但可能不在V1运行时中。

发布了类似的问题here,但这与应用程序设置有关,与连接字符串无关。我认为使用CloudConfigurationManager应该不是正确的解决方案。

除非您正在使用Entity Framework,否则也可以尝试将连接字符串放入应用程序设置中。

  

仅当您使用实体框架时,连接字符串才应与功能应用程序一起使用。对于其他情况,请使用“应用程序设置”。 Click to learn more。   (通过Azure门户)

不确定这是否也适用于V1运行时。

答案 1 :(得分:0)

解决方案是为连接字符串添加私有静态字符串。然后,如果配置失败,则仅从配置中读取。然后,我添加了重试,暂停了半秒钟。这基本上消除了这种情况的发生。

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次这种异常变成了无。