如何使用Ballerina连接Azure SQL Database?连接重置错误求助
排查Ballerina连接Azure SQL Database的连接重置错误
我使用mssql Ballerina包(版本1.6.1)连接Azure SQL Database时,遇到如下连接重置错误:
错误信息
error: Error in SQL connector configuration: Failed to initialize pool: Connection reset ClientConnectionId:5d5b4f8b-7e6e-43d0-bce3-5fe79e403088 Caused by :Connection reset ClientConnectionId:5d5b4f8b-7e6e-43d0-bce3-5fe79e403088 Caused by :Connection reset at ballerinax.mssql.1:createClient(Client.bal:173) ballerinax.mssql.1:init(Client.bal:49) viggnah.test_apis.0.$anonType$_1:$get$test(testAPI.bal:45)
代码示例
import ballerina/sql; import ballerina/http; import ballerinax/mssql.driver as _; import ballerinax/mssql; configurable int servicePort = 9090; configurable string user = "admin@my-server"; configurable string host = "my-server.database.windows.net"; configurable string database = "my-db"; configurable int dbPort = 1443; configurable string password = "***"; service / on new http:Listener(servicePort) { resource function get test(string id) returns error? { mssql:Client|sql:Error dbClient = new(host=host, user=user, password=password, database=database, port=dbPort); if dbClient is error { return dbClient; } } }
排查与解决方案
1. 修正数据库端口配置
Azure SQL Database的默认端口为1433,代码中配置的1443非标准端口,除非你在Azure上特意修改过端口,否则将dbPort改为1433。
2. 启用强制加密连接
Azure SQL要求所有连接必须使用SSL加密,Ballerina mssql客户端默认未启用该配置,需在创建mssql:Client时添加ssl=true参数:
mssql:Client|sql:Error dbClient = new(host=host, user=user, password=password, database=database, port=dbPort, ssl=true);
3. 检查Azure SQL防火墙规则
- 登录Azure门户,进入目标SQL Database对应的服务器,确认防火墙规则中已添加Ballerina服务所在主机的公网IP地址,允许其访问1433端口。
- 如果Ballerina服务运行在Azure内部(如App Service、VM),可启用“允许Azure服务和资源访问此服务器”选项。
4. 验证认证信息准确性
- 确认用户名格式正确:应为
[用户名]@[Azure SQL服务器名称],服务器名称需与Azure门户上的完全一致(如my-server.database.windows.net去掉后缀,仅用my-server)。 - 验证密码、数据库名称无拼写错误,且该用户拥有目标数据库的访问权限。
5. 检查包版本兼容性
- 确认当前使用的Ballerina版本与mssql 1.6.1包兼容,若存在版本冲突,尝试升级mssql包至最新稳定版,修复已知的连接问题。
修正后的完整代码
import ballerina/sql; import ballerina/http; import ballerinax/mssql.driver as _; import ballerinax/mssql; configurable int servicePort = 9090; configurable string user = "admin@my-server"; configurable string host = "my-server.database.windows.net"; configurable string database = "my-db"; configurable int dbPort = 1433; configurable string password = "***"; service / on new http:Listener(servicePort) { resource function get test(string id) returns error? { mssql:Client|sql:Error dbClient = new(host=host, user=user, password=password, database=database, port=dbPort, ssl=true); if dbClient is error { return dbClient; } // 使用完毕后关闭客户端,避免连接泄漏 check dbClient.close(); return; } }
内容的提问来源于stack exchange,提问作者viggnah
相关产品推荐
相关产品推荐

