none
镜像发生故障转移后WEB长时间无法访问 RRS feed

  • 问题

  • 各位大侠:

    我发现:在数据库镜像发生故障转移到镜像服务器后,WEB有很长时间(>5分钟)无法访问,可镜像服务器上已显示DB已同步了,而且我也可以查看所有表的。同时,如果再把数据库从镜像服务器转移到主体服务器,WEB访问基本不受影响(只有2秒无法访问)。

    我的SQL版本是:SQL 2008 R2,服务器OS均是WIN 2003 X64,ASP.NET版本是v2.0.50727。

    我的connectionstring是:

    <add name="DevKitDB" connectionString="Server=10.240.248.21;Failover Partner=10.240.248.22;User id=auth;Password=xxxxxx;Database=Auth;Connect Timeout=5" providerName="System.Data.SqlClient"/>

    现在发现一个问题:只要把web.confg文件内容任意修改并保存后,WEB可以立刻访问。(修改web.config会导asp.net application domain重新载入)

    请问如何才能保证主体故障转移到镜像的时候,WEB能尽快提供服务?

    错误信息有如下2种,报这些错误的时候,镜像确定已经转移成功了。。。

    SHUTDOWN 正在进行。
    用户 'auth' 登录失败。
    当前命令发生了严重错误。应放弃任何可能产生的结果。

    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)、


    Thanks, Yoyo Yu
    • 已移动 孟宪会Moderator 2010年12月16日 2:19 (发件人:Web, IE 9 Beta 相关讨论 (IIS,IE8等))
    2010年12月15日 9:01

答案

  • 是连接池的原因导致的,因为连接池还认为连接时有效的。可以参考这个解决

     

    http://dbaspot.com/forums/ms-sqlserver/141805-failover-causes-transport-level-error.html

     

    This is actually an issue with the connection pool. If a connection is in
    the connection pool when a failover happens, then it will still think the
    connection is valid. When you then try to open the connection you get the
    dreaded general network error instead of a valid connection. As soon as
    this error happens all other connections in the connection pool are dropped
    and new connections will succeeded. Microsoft recommends that you catch the
    errors on opening the connection and retry.


    【孟子E章】
    2010年12月16日 2:08
    版主
  • 禁用连接池应该就可以了 Pooling=false

     

    或者修改下代码,在重新连接之前,执行 Clearpools()/Clearallpools()

    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.clearpool.aspx

    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.clearallpools.aspx


    【孟子E章】
    2010年12月16日 2:11
    版主
  • 你好:

    应该是连接池的问题,或者你的数据请求是使用了缓存而没有获取到真实数据。


    I am here!
    2010年12月16日 6:19
    版主

全部回复

  • 各位大侠:

    我发现:在数据库镜像发生故障转移到镜像服务器后,WEB有很长时间(>5分钟)无法访问,可镜像服务器上已显示DB已同步了,而且我也可以查看所有表的。同时,如果再把数据库从镜像服务器转移到主体服务器,WEB访问基本不受影响(只有2秒无法访问)。

    我的SQL版本是:SQL 2008 R2,服务器OS均是WIN 2003 X64,ASP.NET版本是v2.0.50727。

    我的connectionstring是:

    <add name="DevKitDB" connectionString="Server=10.240.248.21;Failover Partner=10.240.248.22;User id=auth;Password=xxxxxx;Database=Auth;Connect Timeout=5" providerName="System.Data.SqlClient"/>

    现在发现一个问题:只要把web.confg文件内容任意修改并保存后,WEB可以立刻访问。(修改web.config会导asp.net application domain重新载入)

    请问如何才能保证主体故障转移到镜像的时候,WEB能尽快提供服务?

    错误信息有如下2种,报这些错误的时候,镜像确定已经转移成功了。。。

    SHUTDOWN 正在进行。
    用户 'auth' 登录失败。
    当前命令发生了严重错误。应放弃任何可能产生的结果。

    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)、


    Thanks, Yoyo Yu
    2010年12月15日 9:00
  • 您好,找个一篇文章,请参考,希望有帮助:http://technet.microsoft.com/en-us/library/cc917713.aspx

    如果问题解决了,也请做个小结,跟大家分享一下,谢谢!

    2010年12月15日 15:14
    版主
  • Jiyuan,

    你好,你发的这篇文章是介绍SQL镜像的,可现在问题不是出自镜像,而是ASP.NET应用上的。

    问题没有解决,请问大家还有什么想法?

    谢谢。


    Thanks, Yoyo Yu
    2010年12月16日 1:24
  • 看样子是登录的问题,试试这个

    http://support.microsoft.com/kb/918992/zh-cn


    【孟子E章】
    2010年12月16日 2:05
    版主
  • 是连接池的原因导致的,因为连接池还认为连接时有效的。可以参考这个解决

     

    http://dbaspot.com/forums/ms-sqlserver/141805-failover-causes-transport-level-error.html

     

    This is actually an issue with the connection pool. If a connection is in
    the connection pool when a failover happens, then it will still think the
    connection is valid. When you then try to open the connection you get the
    dreaded general network error instead of a valid connection. As soon as
    this error happens all other connections in the connection pool are dropped
    and new connections will succeeded. Microsoft recommends that you catch the
    errors on opening the connection and retry.


    【孟子E章】
    2010年12月16日 2:08
    版主
  • 禁用连接池应该就可以了 Pooling=false

     

    或者修改下代码,在重新连接之前,执行 Clearpools()/Clearallpools()

    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.clearpool.aspx

    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.clearallpools.aspx


    【孟子E章】
    2010年12月16日 2:11
    版主
  • 你好:

    应该是连接池的问题,或者你的数据请求是使用了缓存而没有获取到真实数据。


    I am here!
    2010年12月16日 6:19
    版主