C#如何“验证”新连接实际上是从连接池重用的

时间:2012-01-25 12:43:51

标签: c# database connection odbc pooling

我有一个简单的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相关的答案。

我的'connection'对象中是否有任何数据记录,或者我可以实际看到池中有多少未使用的连接以及我的应用程序使用了多少连接。

提前致谢...

3 个答案:

答案 0 :(得分:3)

  

“我如何确保我的新连接来自连接   池,它没有击中数据库“

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

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

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

SQL Server Connection Pooling

  

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

     

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

     

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

     

只能汇集具有相同配置的连接。 ADO.NET   同时保留多个池,每个配置一个池。   连接按连接字符串和by分隔为池   使用集成安全性时的Windows身份。连接是   也根据他们是否参加交易而汇总。

答案 1 :(得分:1)

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

答案 2 :(得分: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;

}