【发布时间】:2018-11-13 14:07:16
【问题描述】:
我使用一个 cs 便利类来处理我的 sql 查询。 这是基本的,您通过指定数据库名称来实例化,它一次只管理一个命令/数据读取器。
public static void Connect (string DBName)
{
string connectionString =
"Server=serverNaaaaaaaaame;Database="
+ DBName
+ ";Integrated Security=SSPI;";
try
{
if (cnn != null)
cnn.Close ();
cnn = new SqlConnection (connectionString);
cnn.Open ();
}
catch (Exception e)
{
string aaaaaa = e.Message;
}
}
public void Command (string command)
{
try
{
if (drd != null)
drd.Dispose ();
if (cmd != null)
cmd.Dispose ();
cmd = new SqlCommand (command, cnn);
//cmd.CommandTimeout = 300;
drd = cmd.ExecuteReader ();
}
catch (Exception e)
{
string aaaaaa = e.Message;
}
}
事实上,在我的代码的多线程部分中,我经常遇到超时。这似乎是由于我的并发连接量太高。 (如果我在超时时进入调试并尝试在 mssqlsms 中执行查询,它会挂起,直到我停止调试。)
有人告诉我要在连接字符串中设置 Max Pool Size 选项,但我看不出它会产生什么影响。
它会改变我可以插入同一个数据库的 SqlConnections 的数量吗?
它是否会改变我一次可以使用的并发 SqlCommand 和后续 sqlDataReaders 的数量?在同一个 SqlConnection 上? 还有什么?
我必须在我的所有连接字符串中指定它吗?
如果数据库已经在另一个软件中使用,有什么影响吗?
【问题讨论】:
-
问题是你用一种方法打开一个连接并且在尝试另一个连接之前永远不会关闭它。这意味着锁会保留很长时间,一个连接可能会阻塞另一个连接。不要那样做。 只在需要时使用一个连接。连接池意味着您不会为此付出任何性能损失。检查What is the Managed C++ equivalent to the C# using statement。它展示了如何定义、使用和处置连接
-
@PanagiotisKanavos 你是说我应该在构建数据读取器后关闭连接吗?我在这门课上也有一个关闭的功能。这是有道理的,因为连接只使用一次(至少在这种情况下)。