[英].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.