2016-05-30 76 views
1

我有一个很奇怪的问题,并希望有人在那里有类似的经历。.NET SQL Server连接问题 - 也许连接池相关

我的公司申请的一个客户端在我们的应用程序开始时就被SQL Server“禁止”了。行为很奇怪。我会以点形式写出来。

创建SQL连接,检索数据,关闭连接,与其他数据源交谈,然后拒绝访问SQL Server。

这里的长篇大论版本:

.NET应用程序连接到数据库多次。获取一些数据,做一些工作。然后它会获得更多的数据,然后出现“SQL Server无法找到或访问被拒绝”的错误。如果在不重新启动应用程序的情况下再次启动该进程,则不能再向SQL Server连接。所有新的连接都会导致“无法找到SQL Server或访问被拒绝”。如果应用程序重新启动,那么它将重复上述过程。

这是5年来我第一次遇到这个问题。该应用程序确实有用Delphi 7编写的代码.Dephi 7/VBA代码没有问题。我的.NET代码执行实际查询如下所示:

protected abstract DbConnection GetConnection(); 
    protected abstract DbDataAdapter GetDataAdapter(DbCommand cmd); 
    protected abstract DbCommand GetCommand(DbConnection conn, String sql); 
    protected abstract DbCommandBuilder GetCommandBuilder(DbDataAdapter adapter); 

    public virtual DataTable Query(string sql) 
    { 
     var dt = new DataTable(); 

     using (var conn = GetConnection()) 
     { 

      try 
      { 
       using (var cmd = GetCommand(conn, sql)) 
       { 

        using (var adapter = GetDataAdapter(cmd)) 
        { 
         adapter.Fill(dt); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new SqlStatementException(sql, ex); 
      } 
     } 

     return dt; 
    } 

这是我自己非常脏的DAL。当它使用它使用OleDbConnection。

注意:由于遗留代码,连接字符串配置为OleDbConnection。花点时间检查我的代码后,我确实有能力将连接类型更改为SqlConnection。我还没有尝试过。

在客户端的机器上,我一直无法在主应用程序之外重现问题。我尝试创建一个小应用程序,使用上面的格式使用OleDbConnection将100个调用背对背,但它成功执行。

主应用程序的失败发生在同一个地方。这应该给我一个线索,除非我无法理解它,因为它正在进行重复查询,获取相同的数据。但我会说应用程序会与两个数据源对话并将数据从一个数据源传输到另一个数据源。在它进行转移之前,它对源代码进行了一些验证。因此,它通过ODBC与另一个数据库(基于专有文件)进行通信,并成功返回,然后在尝试通过OleDbConnection与SQL Server交谈时失败。

我的怀疑是在连接池中发生的事情。这导致了失败,从而导致拒绝访问。

其他有趣的一点。所有的工作都很好,大约一年前,客户在几个月前买了一台新机器,一切正常,然后突然停下来。我把应用程序放在客户端的另一台机器上,一切都运行良好,然后出现了同样的问题。我们在客户端的机器上关闭了所有东西,但问题依然存在。我认为防火墙,但没有运气。

任何帮助,非常感谢。

+0

验证SQLSERVER没有t将其进行更改为连接未在此代码关闭。另外,如果服务器不接受多个连接,那么这将成为连接到同一服务器上的多个数据库的问题 – Shon

+0

@Shon:using语句关闭连接。澄清一个数据源在一台服务器上,另一个数据源在另一台服务器上。虽然在同一台服务器上应该不成问题。 –

+0

我不太了解,但我不认为连接池问题会带来这样的信息。 “无法找到SQL Server或访问被拒绝”。但是,您的怀疑在某些观点上也是有道理的。词“新机”,“拒绝访问”,“ConnectionString的”让我觉得事情的授权,但只是想.. –

回答

0

要去把这个评论,但它得到太大:-)

我看到您的连接,创建方法都是​​抽象的。这当然意味着衍生物在创建连接时可以做各种不好的事情。我会先看看那里。

我在类似的情况中发现了一件事......如果您在创建连接的代码中执行某些操作,该连接使连接字符串为唯一的,那么您将不会重用这些池连接。所以...做一些类似于添加"App=MyApp" +增加数字,日期/时间或guid的操作,它会破坏您使用池式连接的能力。当这件事发生在我身上时,我花了我一个时间才弄明白。

如果你的应用在过去是“慢不够”,这样的“老”池连接掉出库的,你可能永远不会看到一个问题......但后来,有一位客户变热新的硬件.. 。和怪!从无处可疑的错误!这可能不是你正在发生的事情,但也许它会给你一些关于在哪里寻找的想法。祝你好运!

+0

好消息是我的连接字符串保持不变。我不修改它。你记得你收到的错误吗?难以理解,如“服务器无法访问或访问被拒绝”? –

+0

对不起 - t'was很久以前...但它似乎是这样的效果。我记得以为它没有什么帮助:-)你怎么知道*你在使用连接池?您可以在SQL Server Management Studio中观察连接。 – Clay

+0

我认为.NET是在封面下做的。我无法轻松访问SSMS。我正在考虑访问它进行性能分析等。 –