You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure定时触发函数部署后MySQL连接失败(本地正常)

解决Azure定时函数连接Azure MySQL的Socket权限错误问题

1. 修正连接字符串配置与格式

  • 禁止硬编码敏感信息:Azure函数需通过应用配置存储连接字符串,避免直接写在代码里。在Azure门户的函数应用→配置→应用程序设置中添加连接字符串(名称示例:BoppWhDbConnection),使用Azure MySQL标准格式:
    Server=<server_name>.mysql.database.azure.com;Database=boppwh;Uid=<username>;Pwd=<password>;SslMode=Required;
    
    必须添加SslMode=Required,Azure MySQL强制要求SSL连接,缺失此参数会直接导致连接失败。
  • 代码中读取配置:修改代码通过依赖注入获取配置,替换硬编码逻辑:
    using System;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    using MySql.Data.MySqlClient;
    using Microsoft.Extensions.Configuration;
    
    namespace Ash.Function
    {
        public class AshDaily
        {
            private readonly ILogger _logger;
            private readonly string _connectionString;
    
            public AshDaily(ILoggerFactory loggerFactory, IConfiguration configuration)
            {
                _logger = loggerFactory.CreateLogger<AshDaily>();
                _connectionString = configuration.GetConnectionString("BoppWhDbConnection");
            }
    
            [Function("AshDaily")]
            public void Run([TimerTrigger("*/30 * * * * *")] TimerInfo myTimer)
            {
                using (var bp1db = new MySqlConnection(_connectionString))
                {
                    bp1db.Open();
                    string query1 = "SELECT COUNT(cellid) AS free1 FROM cells WHERE Status = 0";
                    using (MySqlCommand cmd1 = new(query1, bp1db))
                    using (MySqlDataReader reader1 = cmd1.ExecuteReader())
                    {
                        string freecell = String.Empty;
                        while (reader1.Read())
                        {
                            freecell = reader1.GetString("free1");
                        }
                        _logger.LogInformation("空闲单元格数量: {FreeCell}", freecell);
                    }
                }
            }
        }
    }
    
    用using语句自动释放连接、命令和读取器,避免资源泄漏;通过IConfiguration读取配置,符合Azure函数最佳实践。

2. 检查Azure MySQL防火墙规则

  • 登录Azure门户,进入你的MySQL服务器→防火墙和虚拟网络,确保允许Azure服务和资源访问此服务器开关处于开启状态。
  • 若函数应用部署在虚拟网络内,需添加对应VNet规则,允许虚拟网络流量访问MySQL服务器。

3. 验证函数应用的网络出站权限

  • 若函数应用启用了专用端点或网络限制,需确认出站规则允许访问MySQL服务器的3306端口(Azure MySQL默认端口)。
  • 检查函数应用的网络配置→出站流量,确保未阻止到<server_name>.mysql.database.azure.com:3306的连接。

4. 调整连接实例使用方式

  • 不要将MySqlConnection作为类的只读字段复用,连接池会自动管理连接资源,每次请求创建新连接并通过using释放是更安全的做法,复用实例可能导致连接状态异常。

内容的提问来源于stack exchange,提问作者lavava92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:48:22