2

我有一个简单的 c# 代码,我在其中尝试多次打开和关闭连接。如何确保我的新连接来自连接池并且它没有访问数据库?

using System;
using System.Data;
using System.Data.Odbc;
using System.Collections.Generic;

namespace LBSService
{
    class MyClass    {
        public static OdbcConnection connection = null;       
        public void TestConnection()
        {
            string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                        Database=my_database;Uid=informix;
                                        Pwd=Some@123";

            for (int i = 1; i <= 50; i++)
            {
                string StrQuery = "select * from capture_files";
                connection = new OdbcConnection(connectionstring);
                connection.Open();
                connection.Close();
            }
        }
    }
}

我有必须打开 ODBC 连接的限制,因此首选与 ODBC 相关的答案。

我的“连接”对象中是否有任何数据成员,或者我实际上可以看到池中有多少未使用的连接以及我的应用程序使用了多少。

提前致谢...

4

3 回答 3

3

“我如何确保我的新连接来自连接池并且它没有访问数据库”

这是稍微错误的逻辑。连接池位于客户端。即使您重用池中的连接,任何命令仍然必须访问数据库。

如果您有完全相同的连接字符串(甚至大小写),那么您将重用池中的连接(前提是它已打开,这是默认设置)。

连接池存在的原因是因为建立连接需要一些开销。

SQL Server 连接池

连接到数据库服务器通常包括几个耗时的步骤。必须建立诸如套接字或命名管道之类的物理通道,必须发生与服务器的初始握手,必须解析连接字符串信息,必须由服务器验证连接,必须运行检查以登记当前交易等等。

实际上,大多数应用程序仅使用一种或几种不同的连接配置。这意味着在应用程序执行期间,许多相同的连接将被重复打开和关闭。为了最大限度地降低打开连接的成本,ADO.NET 使用了一种称为连接池的优化技术。

连接池减少了必须打开新连接的次数。pooler 维护物理连接的所有权。它通过为每个给定的连接配置保持一组活动连接来管理连接。每当用户在连接上调用 Open 时,池化程序都会在池中查找可用的连接。如果池连接可用,则将其返回给调用者,而不是打开新连接。当应用程序对连接调用 Close 时,池化程序会将其返回到池中的活动连接集,而不是关闭它。一旦连接返回到池中,它就可以在下一次 Open 调用中被重用。

只能汇集具有相同配置的连接。ADO.NET 同时保留多个池,每个配置一个。连接按连接字符串分隔到池中,并在使用集成安全性时按 Windows 标识分隔。连接也根据它们是否在事务中登记而被池化。

于 2012-01-25T12:46:48.350 回答
1

您可以查看 ADO.net Performancecounters 以确保只有一次活动的数据库连接

于 2012-01-25T12:46:56.910 回答
0

您可以在函数中使用计时来添加和删除连接字符串:

Pooling=false;

如果时间不同 - 然后没有这个字符串连接被重用

像这样:

public long TestConnection(bool usepooling)
{
  string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                    Database=my_database;Uid=informix;
                                    Pwd=Some@123;Pooling="+usepooling.ToString;


  Stopwatch sw = new Stopwatch();
  for (int i = 1; i <= 50; i++)
  {
    string StrQuery = "select * from capture_files";
    connection = new OdbcConnection(connectionstring);
    sw.Start();
    connection.Open();
    connection.Close();
    sw.Stop();
  }

  return sw.ElapsedMilliseconds;

}
于 2012-01-25T12:46:31.137 回答