在 cpp/cli 中的 Sql 连接字符串中设置最大池大小选项有什么影响
What is the impact of setting the Max Pool Size option in a Sql Connection string in cpp/cli
我使用 cs 便利工具 class 来处理我的 sql 查询。
它是基本的,您通过指定数据库名称来实例化,它一次只能管理一个 command/datareader duo。
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 中执行查询,它会挂起直到我停止调试。)
有人告诉我要在连接字符串中设置最大池大小选项,但我看不出它有什么影响。
它会改变我可以插入同一数据库的 SqlConnections 的数量吗?
它会改变我可以同时使用的并发 SqlCommand 和后续 sqlDataReader 的数量吗?在同一个 SqlConnection 上?
还有别的吗?
我是否必须在所有连接字符串中指定它?
如果数据库已经在另一个软件中使用,是否有任何影响?
在多线程环境中推荐的场景是
- 打开 SqlConnection(这会创建或获取池中的现有连接)
- 用readers/commands
处理数据
- 尽快关闭 SqlConnection 以释放池连接以供其他线程使用)
According MSDN,MaxPoolSize 限制池中的并发连接数(对于每个 unique 连接字符串)。
Does it change the quantity of SqlConnections I can plug to the same
database?
是的,当 open/used SqlConnection 的计数 > MaxPoolSize 时,应用程序正在等待直到池连接被释放。
Does it change the amount of concurrent SqlCommand and subsequent
sqlDataReaders I can use at once? On the same SqlConnection? Something
else?
是的,正如上面所说,并发连接数受 MaxPoolSize 限制。
但是,SqlDataReader 依赖于 SqlConnection,您可以(顺序地)在同一个连接中使用多个读取器(另请参阅多个记录集的 MARS 选项)。
Do I have to specify it in all my connection strings?
通常,您只需要一个用于池化的连接字符串。否则你需要管理多个池。
Does it have any effect if the database is already in use in another
soft?
是的,您的查询会影响 DBMS 性能,甚至可能会锁定同一数据库中其他应用程序执行的某些处理。
但是,这个问题不是多线程特有的。
我使用 cs 便利工具 class 来处理我的 sql 查询。 它是基本的,您通过指定数据库名称来实例化,它一次只能管理一个 command/datareader duo。
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 中执行查询,它会挂起直到我停止调试。)
有人告诉我要在连接字符串中设置最大池大小选项,但我看不出它有什么影响。
它会改变我可以插入同一数据库的 SqlConnections 的数量吗?
它会改变我可以同时使用的并发 SqlCommand 和后续 sqlDataReader 的数量吗?在同一个 SqlConnection 上? 还有别的吗?
我是否必须在所有连接字符串中指定它?
如果数据库已经在另一个软件中使用,是否有任何影响?
在多线程环境中推荐的场景是
- 打开 SqlConnection(这会创建或获取池中的现有连接)
- 用readers/commands 处理数据
- 尽快关闭 SqlConnection 以释放池连接以供其他线程使用)
According MSDN,MaxPoolSize 限制池中的并发连接数(对于每个 unique 连接字符串)。
Does it change the quantity of SqlConnections I can plug to the same database?
是的,当 open/used SqlConnection 的计数 > MaxPoolSize 时,应用程序正在等待直到池连接被释放。
Does it change the amount of concurrent SqlCommand and subsequent sqlDataReaders I can use at once? On the same SqlConnection? Something else?
是的,正如上面所说,并发连接数受 MaxPoolSize 限制。 但是,SqlDataReader 依赖于 SqlConnection,您可以(顺序地)在同一个连接中使用多个读取器(另请参阅多个记录集的 MARS 选项)。
Do I have to specify it in all my connection strings?
通常,您只需要一个用于池化的连接字符串。否则你需要管理多个池。
Does it have any effect if the database is already in use in another soft?
是的,您的查询会影响 DBMS 性能,甚至可能会锁定同一数据库中其他应用程序执行的某些处理。 但是,这个问题不是多线程特有的。