用于负载平衡DB的Mono .Net SqlConnection无法正常工作

时间:2012-12-03 16:34:48

标签: .net sql-server ado.net mono haproxy

我正在运行以下代码......

using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["db-connection"].ConnectionString))
{
    connection.Open();
    var command = new SqlCommand("SELECT @@SERVERNAME",connection);

    using (var reader = command.ExecuteReader())
    {
        reader.Read();
        return reader[0].ToString();
    }
}

...作为完整性检查,返回此应用程序指向的数据库服务器的名称。有两个数据库服务器(DB00和DB01),它们位于HAProxy之后,如果DB00不可用,则设置为故障转移到DB01。

连接字符串如下所示:

    <add name="db-connection"
connectionString="User Id=USER_ID; Password=PASSWORD; Initial Catalog=the-database; Server=load-balancer.is.here,59281; Application Name=My.Application.Name;Min Pool Size=5;Max Pool Size=500;Connect Timeout=10;Connection Lifetime=29;" />

我们遇到的问题是:

  • 我们故障转移到DB01(目前通过编辑HAProxy配置完成,使DB00成为备份,然后重新加载HAProxy)
  • SELECT代码(此问题开头的代码)现在应该返回DB01作为服务器名称,但它没有,它仍然返回DB00
  • 这意味着我们的SQLConnections似乎仍然指向错误的数据库
  • 问题一直存在,直到我们在代码托管的方框上重新启动单声道进程
  • 现在,完整性检查代码返回正确的服务器名称 - DB01

任何想法可能是什么?它可能是单声道连接池问题吗?

修改 HAProxy配置按要求:

1 global
2         maxconn 4096
3         daemon
4 
5 defaults
6         mode tcp
7         #mode http
8         contimeout      5000
9         clitimeout      50000
10         srvtimeout      50000
11 
12 
13 frontend blahblah
14         bind *:59283
15         mode tcp
16         default_backend sql-server-lockertest
17 
18 backend sql-server-lockertest
19         balance roundrobin
20         server james 10.0.10.217:1433 check maxconn 32 rise 3 fall 3 
21         server andres 10.0.10.226:1433 check maxconn 32 rise 3 fall 3 backup

此致

詹姆斯

1 个答案:

答案 0 :(得分:1)

事实证明,Mono不支持连接字符串中的“连接生命周期”参数。

但我们只是修复了它并提出了一个拉取请求:

https://github.com/mono/mono/pull/517