繁体   English   中英

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

[英].NET SQL Server connection issue - Maybe connection pool related

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

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

我怀疑是连接池中发生了什么。 这导致失败,进而导致拒绝访问。

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

非常感谢任何帮助。

会把它放在评论中,但它太大了:-)

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

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

如果您的应用程序过去“足够慢”,那么“旧的”池化连接会从池中掉出来,您可能永远不会看到问题......但是,然后,说客户获得热门的新硬件......而且责备。 ..无处不在的错误! 这可能不是你发生的事情,但它可能会给你一些关于在哪里看的想法。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM