.NET SQL Server连接问题 - 可能与连接池相关

时间:2016-05-30 14:29:59

标签: c# .net sql-server connection-pooling

我有一个非常奇怪的问题,我希望那里的人有类似的经历。

在我们的应用程序开始时,我的公司应用程序的一个客户端正在从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通信时失败。

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

是否会将其放在评论中,但它太大了: - )

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

我在类似的情况下发现了一件事......如果你在代码中做了一些事情来创建连接,使连接字符串唯一,你就不会成为重用那些汇集的联系。所以...做一些事情,比如添加一个"App=MyApp" +递增的数字,日期/时间或guid,它会破坏你使用池化连接的能力。当这件事发生在我身上时,我花了很长时间才弄明白。

如果你的应用程序足够慢,那么#34;在过去,这样" old"汇集的连接从池中掉出来,你可能永远不会看到问题...但是,然后,说一个客户获得热门的新硬件......并且责备......奇怪的错误无处不在!这可能不是你发生的事情,但也许它会给你一些关于在哪里看的想法。祝你好运!